• v2.9.0 c072300969

    dean released this 2026-08-16 08:47:35 -05:00 | 0 commits to main since this release

    📅 Originally published on GitHub: Sun, 16 Aug 2026 13:58:14 GMT
    🏷️ Git tag created: Sun, 16 Aug 2026 13:47:35 GMT

    Upstream sync

    Aligned to upstream commit 41d3b9c (249 commits since abbc2a6). Upstream has rewritten its playback stack in the meantime:

    • Native TIDAL queries via HiFiClient + a new "Unified Playback" API (Cloudflare Turnstile protected) + Deezer fallback. The old HiFi proxy instances are all gone.
    • Accounts moved to better-auth, native OAuth via @capacitor/browser and the monochrome://auth-callback deep link.

    The wrapper keeps working because the WebView runs with hostname: monochrome.tf as origin, so Turnstile and the CORS checks treat it like the official site. Full-length playback is back (no more 0:29 / 1:40 previews).

    Changes

    • Dropped 2 build-time patches that no longer apply: storage.js streaming-instance fallback (upstream removed the hardcoded list) and HiFi.ts tracks.albums.coverArt (merged upstream). The remaining 12/12 patches apply cleanly.
    • AndroidManifest.xml: added the monochrome://auth-callback intent-filter for the native login flow.
    • build-web.sh: recreate dist-web.zip from scratch and prune stale assets/ on deploy.
    • versionCode 13, versionName 2.9.0.

    Verified

    Tested on an emulator (Pixel 6, API 35): search returns 100 tracks, playing "Creep" and skipping to the next track both work, MediaSession reports PLAYING, foreground service notification is shown.

    Download

    Install with adb:

    adb install -r Monochrome-debug.apk
    

    If you're upgrading from an older build and something looks off, clear the app data once (Settings > Apps > Fabiodalez Music > Clear data).

    Downloads
  • v2.8.1 bfab3e8f90

    dean released this 2026-05-11 08:40:42 -05:00 | 1 commits to main since this release

    📅 Originally published on GitHub: Mon, 11 May 2026 13:41:01 GMT
    🏷️ Git tag created: Mon, 11 May 2026 13:40:42 GMT

    Fix

    • Tidal proxy: migrated from tidal-api.geeked.wtf to tidal-proxy.monochrome.tf (official Cloudflare-backed proxy on monochrome.tf infrastructure)

    Root cause

    The upstream switched the Tidal API proxy in commit abbc2a6. The old proxy tidal-api.geeked.wtf was causing streaming failures. The new proxy tidal-proxy.monochrome.tf is the official instance used by monochrome.tf, confirmed working.

    Upstream sync

    Aligned to upstream commit abbc2a6. All 11/11 patches pass without changes.

    Download

    Install with adb:

    adb install -r Monochrome-debug.apk
    
    Downloads
  • v2.8.0 b03298725e

    dean released this 2026-05-07 17:48:34 -05:00 | 2 commits to main since this release

    📅 Originally published on GitHub: Fri, 08 May 2026 07:32:32 GMT
    🏷️ Git tag created: Thu, 07 May 2026 22:48:34 GMT

    Changes

    • New Qobuz proxy: added trypt-hifi-dl-456461932686.us-west1.run.app as primary fallback instance
    • Theme FOUC fix: theme preloaded from localStorage before page render — eliminates white flash on startup
    • New official instance: if-it-runs-ship-it.lol added as upstream failover mirror

    Upstream sync

    Aligned to upstream commit 8cf6740 (monochrome-music/monochrome). All 11/11 patches pass without changes.

    Download

    Install with adb:

    adb install -r Monochrome-debug.apk
    
    Downloads
  • v2.6.1 b3730f7a69

    dean released this 2026-05-03 10:49:18 -05:00 | 4 commits to main since this release

    📅 Originally published on GitHub: Sun, 03 May 2026 15:49:36 GMT
    🏷️ Git tag created: Sun, 03 May 2026 15:49:18 GMT

    Fix

    • Artist page: track rows now show real album cover images instead of random Picsum placeholders

    Root cause

    The Tidal API artist endpoint was requested with tracks,tracks.albums but not tracks.albums.coverArt. Album objects arrived in the response included array without their coverArt relationship, so resolveArtworkId(albumItem, 'coverArt') returned null for every track, triggering the getCoverUrl(null) Picsum fallback.

    Adding tracks.albums.coverArt to the include parameter lets the API return the full artwork relationship and UUID, displaying real covers.

    Downloads
  • v2.6.0 a935cfbf68

    dean released this 2026-05-03 09:58:50 -05:00 | 6 commits to main since this release

    📅 Originally published on GitHub: Sun, 03 May 2026 14:59:07 GMT
    🏷️ Git tag created: Sun, 03 May 2026 14:58:50 GMT

    Changes

    Sync with upstream eb3558a (+6 commits).

    Tidal API proxy (upstream eb3558a)

    All calls to openapi.tidal.com and api.tidal.com are now automatically routed through tidal-api.geeked.wtf, a reverse proxy with correct CORS headers. Previously, direct calls to api.tidal.com were blocked by CORS in the Android WebView and fell back silently to monochrome proxy instances. Now the upstream code handles this transparently.

    AAC 320KBPS downloads (upstream 758726c)

    Fixed incorrect bitrate for high-quality AAC transcoding: HIGH quality now correctly uses 320kbps instead of 256k.

    Other upstream changes

    • am-lyrics library update
    • Option to disable the Parties button from settings

    Patches still active

    • HiFi.ts: add artists.profileArt to unified search include (fix Picsum artist covers)
    • app.js: search debounce 3000ms -> 800ms
    • storage.js: add live streaming instances to hardcoded fallback
    • ui.js: enrich albums missing artist/cover from track data
    • cache.js: per-type TTL + query normalization (trim/lowercase/NFD diacritics)
    • api.js: limit=100 on all search endpoints
    • vite.config.ts: workbox audio/video CacheFirst -> NetworkOnly
    Downloads
  • v2.5.1 baaca85f5d

    dean released this 2026-05-02 04:53:09 -05:00 | 7 commits to main since this release

    📅 Originally published on GitHub: Sat, 02 May 2026 09:53:30 GMT
    🏷️ Git tag created: Sat, 02 May 2026 09:53:09 GMT

    Fix

    Search felt very slow: after finishing typing, the app waited 3 full seconds before navigating to results. Reduced the debounce from 3000ms to 800ms.

    The auto-search now triggers 800ms after the last keystroke, which is the standard for responsive search bars. Pressing Enter still triggers immediately (no debounce). Showing results for partial queries (e.g. "radio" before "radiohead") is normal search behavior.

    What changed

    • app.js: search input debounce 3000ms -> 800ms
    Downloads
  • v2.5.0 71c94caba3

    dean released this 2026-05-02 04:24:20 -05:00 | 8 commits to main since this release

    📅 Originally published on GitHub: Sat, 02 May 2026 09:31:42 GMT
    🏷️ Git tag created: Sat, 02 May 2026 09:24:20 GMT

    Fix

    Artist cards in search results were showing random placeholder images (picsum.photos) instead of real artist profile photos.

    Root cause: the unified search (q=) in HiFi.ts used include=...artists but omitted artists.profileArt. Without that field, the Tidal v2 JSON:API response included artist objects with no profileArt relationship and no artworks entries in included. resolveArtworkId(item, 'profileArt') always returned null, so every artist card called getArtistPictureUrl(null) and got a random Picsum URL.

    The per-artist search tab (a=) already had artists.profileArt and was unaffected. Only the unified search (q=) was broken.

    Fix: add artists.profileArt to the includeQ include string in HiFi.ts (patch #55 in build-android.sh). Verified on device: all 12 artist cards in search results now load real images from resources.tidal.com.

    Also fixed: fm-logger.js was being copied to the Vite source directory (js/) instead of the static assets directory (public/js/), so Vite never included it in the dist bundle. Moved to public/js/ so the on-device console logger works correctly.

    What changed

    • Artist covers: unified search now includes artists.profileArt in the Tidal v2 API request
    • fm-logger.js: copied to public/js/ so Vite includes it in dist/js/ as a static asset

    Patches active

    • HiFi.ts: add artists.profileArt to unified search include (new — fixes Picsum artist covers)
    • storage.js: add live streaming instances to hardcoded fallback
    • ui.js: enrich albums missing artist/cover from track data
    • cache.js: per-type TTL + query normalization (trim/lowercase/NFD diacritics)
    • api.js: limit=100 on all search endpoints
    • vite.config.ts: workbox audio/video CacheFirst -> NetworkOnly
    • android-service.js: foreground audio service, localStorage bootstrap for streaming instances
    • fm-logger.js: console output saved to Downloads/FabiodalezMusic/
    Downloads
  • v2.4.0 c5c87d8c65

    dean released this 2026-05-01 05:27:16 -05:00 | 10 commits to main since this release

    📅 Originally published on GitHub: Fri, 01 May 2026 10:42:34 GMT
    🏷️ Git tag created: Fri, 01 May 2026 10:27:16 GMT

    Fix

    Streaming playback was occasionally returning only a 1:40 preview instead of the full track. Root cause: a previous patch forced the native HiFiClient for streaming (shouldTryNative=true), but the browser client credentials are not premium — only the proxy instances have premium credentials. Removed the patch: streaming now always goes through proxy instances.

    Also removed window.__tidalOriginExtension from the Android wrapper scripts. This flag was originally used to tell upstream to use direct CDN URLs instead of audio-proxy.binimum.org, but it is no longer needed since the WebView origin is already set to https://monochrome.tf (see v2.3.0), which satisfies all proxy and CDN authentication.

    What changed

    • Streaming playback: removed forced native HiFiClient — proxies handle full-quality playback
    • __tidalOriginExtension removed: capacitor.config.ts server.hostname = monochrome.tf makes this flag redundant
    • Upstream sync: d308dac (+67 commits since v2.3.0) — Qobuz multi-instance failover, HiFi artist duration fix (ISO 8601), lossy download transcoding fix

    Patches still active

    • storage.js: add frankfurt-2.monochrome.tf to streaming fallback list
    • ui.js: enrich albums missing artist/cover from track data
    • cache.js: per-type TTL + query normalization (trim/lowercase/NFD diacritics)
    • api.js: limit=100 on all search endpoints
    • vite.config.ts: workbox audio/video CacheFirst -> NetworkOnly
    • fm-logger.js: console output saved to Downloads/FabiodalezMusic/
    • android-service.js: service worker unregistered, foreground audio service active
    Downloads
  • v2.3.0 1caf8cb5b9

    dean released this 2026-04-22 13:01:15 -05:00 | 12 commits to main since this release

    📅 Originally published on GitHub: Wed, 22 Apr 2026 18:01:38 GMT
    🏷️ Git tag created: Wed, 22 Apr 2026 18:01:15 GMT

    Fix

    Audio playback was failing on fresh installs because the Capacitor WebView used Origin: https://localhost, which Tidal API proxies and CDN reject with 403. Existing installs worked because they had cached tokens and stream URLs from when the proxies accepted any origin.

    What changed

    • WebView origin: https://localhost -> https://monochrome.tf -- proxies and CDN now accept our requests
    • TidalWebViewClient: new native Java class that intercepts audio requests to Tidal CDN and re-sends them with Origin: https://listen.tidal.com (equivalent to the Chrome extension "Monochrome Tidal Bypass")
    • window.__tidalOriginExtension: tells upstream code to use direct CDN URLs instead of the broken audio-proxy.binimum.org proxy
    • Service Worker blocked: prevents workbox from intercepting audio fetches (CacheFirst on audio causes CORS failures)
    • Native HiFiClient for streaming: tries direct Tidal API before proxy instances
    • Search album enrichment: albums missing artist/cover in search results are enriched from track data
    Downloads
  • v2.2.0 8b911b63bb

    dean released this 2026-04-22 09:58:11 -05:00 | 13 commits to main since this release

    📅 Originally published on GitHub: Wed, 22 Apr 2026 14:58:29 GMT
    🏷️ Git tag created: Wed, 22 Apr 2026 14:58:11 GMT

    Changes

    Search

    • Reverted debounce to upstream default (3000ms) -- the reduced values (500ms, 700ms) caused the search page to render for partial queries while still typing
    • New: albums in search results that are missing artist name or cover art are now enriched from track data in the same response. This works around the v2 Tidal API not populating album relationships correctly in search results.

    UI

    • Removed pull-to-refresh -- it was triggering false page reloads when scrolling up on album/artist pages
    • Fixed scroll position: navigating to an album or artist page now starts at the top instead of landing mid-page

    Upstream

    Synced to b6b425a (latest upstream/main)

    Downloads