u/ghenry22

Carplay is coming....

Carplay is coming....

A little teaser for everyone who has been chasing me for carplay support. It is coming! I am making progress!

It's a real pain in the ass development experience though, it's very restrictive and there are very few good examples around to refer to for what you can and can't do and how to do it. Also working with react-native adds an extra layer of complication that you need to think about but I have made good progress. In development I can launch substreamer from the head unit, browse and play music without ever touching the phone which is actually pretty cool the first time you do it.

The thing that makes this so time consuming is really the ability to test. You can ONLY test on the ios simulator with it's built in carplay function which has known issues with playback state and a few other things so you spend so much time chasing your tail trying to fix things only to eventually stumble across a reddit post or a github issue on some other random repo confirming it's a simulator issue. It would make the development experience so much easier if you could just go buy a car headunit with carplay and android auto and sit it on your desk and test against it (which was my plan before realising it wouldn't work).

My application is in with Apple for the substreamer carplay entitlement and once they grant that I will be able to test again real headunits which will make things move along faster.

Don't worry I haven't forgotten android auto either, it is also implemented in parity with carplay with all the same functionality. That's been it's own magical journey...

https://preview.redd.it/mi81dj5rvu0h1.png?width=1578&format=png&auto=webp&s=5618c22263dc2479bfde98f1c530d95fe8e16aa1

reddit.com
u/ghenry22 — 17 hours ago

Substreamer 8.0.56 — Hotfix release with a lot under the hood

Hey everyone,

8.0.56 is rolling out now, and while the version number suggests a small hotfix series, this run (8.0.53 → 8.0.56) is actually packed with refinements. The focus has been on hardening Music Downloads v2 and Image Cache v2, squashing some nasty Android and iOS crashes, and a complete rebuild of the cover art color extraction pipeline. Plus a few UX wins that make day‑to‑day use feel a lot smoother.

Here's what's new.

Music Downloads v2 — partial album support

Big improvements to how downloads behave when an album isn't fully cached:

  • Partial album state is now first‑class. Albums that are missing tracks show a clear partial state (orange downloaded icon!)
  • Top‑up any partial album with a single tap to fill in the missing tracks.
  • New filter in Settings → Appearance lets you show or hide partial albums in your offline browsing — your call, it's disabled by default
  • Music cache browser has been updated to surface partial albums and gives you a quick and easy way to back fill any missing tracks or refresh any downloaded track that might have an issue manually
  • This is all groundwork to enable song based library browsing and song downloading

Download queue, now where you'd expect it

Whenever there are items in the download queue, the download queue indicator now appears on every screen where the MiniPlayer is visible. No more wondering if a download is still going while you browse — it's right there.

Image Cache v2 — more robust and self‑healing

  • Recovers blank cover art from broken cache entries automatically.
  • Unsticks incomplete rows so partial cache failures don't permanently ghost an image, with clear repair feedback.
  • Brand new Android image resize path via a custom local module, replacing a flaky plugin that was slow, causing missing thumbnails and worst of all causing app crashes!
  • Image cache scan in Settings now shows a spinner so you know it's working.
  • Image cache will auto repair damaged or missing cached images, but there is also a manual scan and repair function exposed in settings

Cover art color extraction — fully custom, more consistent everywhere, light & dark theme aware

This was a big one. The old react-native-image-colors plugin has been completely replaced with a custom expo-image-colors module built specifically for Substreamer. Wins:

  • Consistent results across iOS and Android — same palette, same vibe, no platform surprises
  • Light/dark mode aware with deliberate contrast skews so header buttons stay readable against any cover

Player fixes

  • Bulletproof queue resume on cold start — open the app and your queue is exactly where you left it
  • MiniPlayer and the main player progress bar share a single source — no more drift between the two
  • Local play count and last‑played update immediately on scrobble instead of waiting for the next refresh
  • Expanded player tabs reordered to Queue / Info / Lyrics, matching the bottom tab bar in the smaller player screen

Library

  • Article‑stripped sorting — your library now respects the server's article list, so "The Beatles" sorts where you'd expect it
  • Cleaner list rows with fixed‑width metadata slots for consistent alignment
  • Home screen listening time auto‑scales to days for those of us with heavy totals
  • Light mode skeleton loaders are now actually visible (oops)

Crash and stability fixes

  • Android: MIUI / Redmi notification controls fix — remote controls should now work reliably on Xiaomi devices (re #87)
  • Android: ANR fix caused by repeated locale formatting in lists (Hermes #867)
  • Android: edge‑to‑edge safe area handling is much improved
  • Android: image‑related Fresco crash suppressed
  • A handful of smaller iOS rendering edge cases ironed out

Translations

  • Full Traditional Chinese (zh‑Hant) translation pass done from the zh‑Hans baseline
  • Refreshed translations across multiple other languages with a terminology consistency pass.

As always — thank you for using Substreamer, for the bug reports, the feature requests, and the kind words. A lot of the fixes in this release came directly from issues you raised. Keep them coming.

Update should be live on both app stores now (or very soon when reviews all finalise). If you spot anything weird, drop a note here or open an issue on GitHub.

🎧

reddit.com
u/ghenry22 — 18 days ago

Substreamer 8.0.52 is here! 🎵

A lot has happened since 8.0.47, there have been a few internal test releases in the interim, some requested features and fixes from github implemented, lots of under the hood stability fixes (especially looking at you Android!) and some major updates to music downloads and metadata handling laying the groundwork for songbased browsing and individual song downloading in a future update.

Please DO NOTE, that there are some data migrations that need to run on first launch with the new update, this means you will see the splashscreen for a bit longer than usual (depending how much music you have downloaded). Please be patient and let it run through, the alternative was to nuke all your downloaded music and that's generally an un popular choice!

✨ New features

  • Lyrics. Full synced lyrics support — your server's lyrics are parsed, scrolled in time with playback, with tap-to-seek to any line, and instrumental gaps between lines show breathing dots so you can see the interlude progressing. For songs without synced timings, Substreamer can synthesize approximate timings from the track duration so you still get a karaoke-ish experience. In either mode you can scroll through the lyrics freely to read ahead, then tap the re-sync pill to jump straight back to the current line and resume autoscroll.
  • Sleep timer. A proper sleep timer, configurable in settings, surfaced as a floating capsule on the cover art. Implemented natively so playback actually stops on time.
  • Queue persists across app restarts. Close the app mid-album, reopen, tap play — it picks up where you left off, position and all. Resume works in offline mode too: non-downloaded tracks are transparently skipped so a partially-cached queue still plays through without stalling.
  • Mini player everywhere. The mini player now follows you as a footer across detail screens, settings, and browser screens — no more losing your playback controls when you navigate away.
  • Music downloads v2. Smarter on-disk layout with cross-item deduplication. A song saved to both an album and a playlist is now stored once, not twice. Less wasted space, cleaner music-cache browser.
  • Image cache Scan + Repair. New tools in settings to check the health of your cover-art cache and auto-repair incomplete downloads when the server comes back.
  • More audio formats, custom formats. Additional streaming and download formats, plus support for defining your own custom format / bitrate combinations when the presets don't match your server's transcoding setup. If you want to match these on the server side, the server transcoding configuration guide (linked from the README) has the exact ffmpeg commands and setup steps for Navidrome, Gonic, Ampache, and Airsonic-Advanced.
  • Redesigned track info and album info panels. Format badges, genre pills, quick stats, a cleaner layout, and navigable artist links from the album detail screen.
  • Native share sheet. Rich share messages for your server's share links, including queue shares.
  • Settings restructure. Settings are now grouped more sensibly. A new "Library & Data" section consolidates sync status, scrobbles, metadata corrections, backups, and shares in one place.
  • Artist page play-mode toggle. A new toggle on the artist page switches whether the play and shuffle-play buttons play just the artist's top songs or their full catalogue.
  • Listening streak on home. See your current streak right on the home screen — now with a clear "days" suffix so there's no ambiguity about what the number represents.
  • New languages. Simplified Chinese, Traditional Chinese, and Russian fully supported alongside the existing languages. Huge thanks to everyone translating on Crowdin — the community contributions are what make multilingual support actually work.

🛠️ Fixes

  • Android stability overhaul. A sweep of native-layer hardening across SDK 36 builds: startup-crash fixes, force-cast removals in the player fork, SSL trust resilience, migration runner hardening, memory-leak patches for react-native-screens, and more. If you've hit random crashes on Android, this release should be dramatically better.
  • Android crash on launch when System appearance is selected. Fixed.
  • Auto-offline reliability. Stale cold-start network state is re-checked so auto-offline doesn't trigger against a now-reachable server.
  • Language picker on login. Now opens as a scrollable bottom sheet instead of getting stuck off-screen on smaller displays.
  • Tuned In length preference. Respected for offline and multi-genre playlists.
  • Raw stream resume. A network blip mid-track will still pause playback briefly, but raw (non-transcoded) streams now recover from where they left off instead of restarting the track from the beginning.

🧹 Polish

  • Lots of UI polish, consistency, and layout updates throughout — typography, spacing, and colour treatment normalised across the app, plus small tweaks across segment controls, cache browsers, bottom sheets, skeleton loaders, and more.

Thanks as always for using Substreamer and reporting issues. Bug reports and feature requests on GitHub. 🎶

u/ghenry22 — 24 days ago