Repository navigation
Releases: Rohithdgrr/OPEN-MUSIC
Release list
OPEN MUSIC v0.5.1
Full Changelog: v0.5.0...v0.5.1
OPEN MUSIC v0.5.0
Full Changelog: v0.4.0...v0.5.0
TRANCE MUSIC v0.4.0
Title: TRANCE MUSIC v0.4.0
Fourth packaged release — and the first multi-source one: the catalog layer is
now source-agnostic (JioSaavn, Audius, Spotify), Android actually plays musicon a fresh install, and CI runs the same suite on Windows, Linux and macOS.
Install
| File | Size | Best for |
|---|---|---|
TRANCE.MUSIC_0.4.0_x64-setup.exe |
~5.6 MB | Double-click install with Start-menu shortcut wizard |
TRANCE.MUSIC_0.4.0_x64_en-US.msi |
~8.1 MB | Group Policy / silent installs, plain Windows Installer |
TRANCE.MUSIC_0.4.0_amd64.deb |
~8.1 MB | Debian/Ubuntu (dpkg -i or Software Center) |
TRANCE.MUSIC_0.4.0_amd64.AppImage |
~83 MB | Run anywhere on x64 Linux, no install |
TRANCE.MUSIC_0.4.0_aarch64.dmg |
~7.0 MB | Drag-to-Applications on Apple Silicon Macs |
app-universal-release.apk |
~19 MB | Android sideload (arm64-v8a + armeabi-v7a + x86_64) |
The signed updater bundle (TRANCE.MUSIC.app.tar.gz + .sig) and both manifests
(latest.json, update.json) ship with the release, so the in-app updater and
Revert list resolve offline of nothing.
iOS: no artifact on this release — ios.yml is workflow_dispatch-only now
(simulator builds no longer ride desktop release tags). The iOS target is still
compiled on every CI run, so it cannot rot silently.
Windows 10/11 x64 with WebView2 (preinstalled on Win 11). Linux x86_64 (the
AppImage needs FUSE; the .deb registers the launcher). macOS 13+ on Apple
Silicon. Existing installs upgrade in place — same
com.openmusic.trancemusic identifier; your offline vault is never touched by
installing or updating. It now lives in the app's own data folder
(%LOCALAPPDATA% / ~/.local/share / ~/Library/Application Support →
TRANCE MUSIC), and a legacy Downloads/TRANCE MUSIC vault is migrated onceon first launch.
SmartScreen note: the updater package is signed with this project's> release key (verified by the app before anything runs), but the installers
built in CI are not yet Authenticode-signed — the certificate lives on the
maintainer's machine, not the runner. On first run Windows may show
"Windows protected your PC" / unknown publisher — click More info →
Run anyway.
macOS note: the
.dmgis not Apple-notarized. On first launch
right-click → Open (or clear the quarantine flag with
xattr -d com.apple.quarantine). The signed updater bundle inside is
verified by the app before anything runs.
Android note: the APK is unsigned — allow Install unknown apps for> whichever app you open it from. Sideloading the new APK over the old one keeps
your vault and settings.
Highlights
- Multi-source catalogs behind one trait.
catalog.rsdefines a
source-agnosticCatalogtrait (search, metadata, playback URLs, home feed,
radio, suggestions) implemented byjiosaavn_catalog.rs,audius.rs(a
licensed, decentralized source) andspotify.rs.proxy.rsstays purely an
HTTP layer, so a new source is a module, not a fork. JioSaavn is an unofficial
API and is treated as dev/test only; Audius is the licensed path. - Spotify sign-in and import on desktop. OAuth 2.0 PKCE over an ephemeral
127.0.0.1loopback listener (RFC 8252 — no client secret). The refresh token
goes to the OS credential store (Windows Credential Manager / Keychain /
Secret Service — the native keyring features are enabled, which is the whole
trick: keyring 3 ships no default store and silently falls back to an
in-memory mock), the access token is memory-only. Client id is a compile-time
TRANCE_MUSIC_SPOTIFY_CLIENT_ID; builds without one run fine and every
command reports "not configured". Plus Exportify CSV → local playlist
import and top-tracks import. - A real app database (
store.db). SQLite + WAL, deliberately separate from
the vault ledger: a song metadata cache with play/favourite counters and
queryable recent / most-played / favourites columns, a smallkvtable for
prefs that must survive localStorage eviction, and a 6 h / 200-row search
cache. Both shells write throughstore_db.js; audio bytes are never stored,
only track JSON, and a missing store degrades to localStorage instead of
breaking. - Search that returns something. One app page now merges 4 upstream pages —
upstream page 1 for common queries was degenerating into near-duplicate rows
that dedup collapsed from 30 to 2 songs. Load-more counts rows pre-dedup so it
stays honest, mobile ranking reuses the desktop'sfuzzy.jsscore with a↕
chip cycling relevance / quality / popular / length / A–Z, and a "did you
mean" action ridessearch_suggestions. - Android plays music on a fresh install.
Number(localStorage.getItem("tm-mobile-vol"))is0for a missing key and
Number.isFinite(0)is true, so the<audio>element shipped muted every
first run. Volume reads go throughbaseVol(), which treats an absent key as
full volume (regression test added). - Mobile feature pass. AI lyrics fallback for songs the LRCLIB/JioSaavn
cascade doesn't know (your own Gemini key, stored locally, one call per track,
cached, always labelled, never overwriting real synced lyrics); listening
streaks plus a "New from artists you follow" shelf on Home; TRANCE-SHARE v1
playlist codes (paste a code, get the playlist with full track objects); a
per-track EQ sheet and crossfade length next to gapless; tab swipes,
swipe-to-dismiss and drag-to-reorder in the queue sheet, mini-art tap/long-press, shared-element zoom; native Android bridges (MediaHub.kt:
notification, lock screen, homescreen widget, Bluetooth/car/headset via
MediaSession); and a 40-entry Diagnostics ring buffer behind Settings. - Desktop additions. Sleep timer shared by both shells (15/30/60/90 min with
a 15 s volume ramp before the pause) and the Exportify importer. - UI polish. Now Playing lyrics rewritten for the light theme (transparent
surface, clean type, karaoke sweep), the Master Audio Specs deck removed from
Now Playing, hover/elevation parity across Playlist / Album / Library / History
rows, and the mini widget re-cut with curved acrylic-obsidian corners. - CI that proves the matrix. Every push runs ESLint,
node --test,
per-modulenode --check, the Tailwind build,cargo fmt,clippy -D warningsandcargo teston windows-latest + ubuntu-latest +
macos-latest, plus an iOS simulator-target compile check andcargo audit.
Dedicated Linux and macOS workflows build.deb/ AppImage and.dmgand run
a post-build smoke test. - Docs and a real front page.
docs/cross-platform-ci.md,
docs/android-silent-playback.md(the full silent-playback post-mortem), a
rebuilt mobile doc set, and a TRANCE MUSIC landing page published from
index.htmlvia GitHub Pages.
Fixed
- Mobile search threw
ReferenceError: Cannot access 'entityKinds' before initializationon every mount (the sort-chip guard read it above its
const) — the screen rendered nothing behind a red toast. - Mobile playlist create/rename/delete used
prompt()/confirm(), which
don't open in an Android WebView. All three moved into the shared themed
bottom sheet, and library removal matches byidinstead of title. - The search sort chip called
go()with an unchanged hash, so nothing
remounted. The sort now rides in the URL (&s=) and survives back-navigation. - The iOS workflow passes the CLI's own target name (
aarch64-sim) to
tauri ios build, and desktop release tags no longer drag simulator builds
along with them.
Verification
- Rust: 152 unit tests (
OP_OFFLINE=1in CI skips the 17 live-upstream
ones),cargo fmt --check,clippy --all-targets -D warnings,cargo audit. - Frontend: 82 tests under
node --test(up from 58), ESLint, per-module
node --check, CSS build. - Mobile: verified on an emulator (
Pixel6_API36) over CDP + logcat — search
volume 52 → 125 rows on scroll auto-load, sort chip, in-screen filters,
downloads with live progress/cancel/pause, vaulted offline playback, SQLite
present and growing, airplane-mode relaunch. Recipe in
verify.md. - Release guard: binaries → verify → manifests; every manifest URL is resolved
against the live release beforelatest.json/update.jsonattach, so a
manifest with unresolvable URLs cannot ship.
Upgrade
From v0.3.0: use Settings → Updates in-app (this release ships its own
update.json, so v0.4.0 is a valid Revert target), or install the new build
over the old one — same identifier, same vault, nothing to migrate. Android
users sideload the new APK over the old one.
Known gaps
- CI-built installers still skip Authenticode (SmartScreen prompt on first run)
and the macOS.dmgis not notarized (Gatekeeper prompt). The Android APK is
unsigned. - iOS has no release artifact by design; the workflow is manual-only.
- Audius and Spotify implement the catalog trait, but there's no source switcher
in the UI yet — the surfaces are search, metadata, sign-in and import. - Downloads cancel is UI-best-effort:
download_songhas no abort channel, so
bytes keep flowing and the finished file is deleted after landing. - This tag predates 5 CI-only fixes on
main(fmt/clippy drift, an iOS
setup-rust-toolchainkey typo, and a flaky live-radio test). The shipped
binaries are unaffected, butmainis green where the tag is not — a
v0.4.1 would pick them up. - Tailwind and the icon font still load from a CDN at runtime.
Full Changelog: v0.3.0...v0.4.0
TRANCE MUSIC v0.3.0
Title: TRANCE MUSIC v0.3.0
Third packaged release - and the first multi-OS one: the same tag now ships Windows, Linux, and macOS installers, all covered by the signed in-app update channel.
Install
| File | Size | Best for |
|---|---|---|
TRANCE.MUSIC_0.3.0_x64-setup.exe |
~5.5 MB | Double-click install with Start-menu shortcut wizard |
TRANCE.MUSIC_0.3.0_x64_en-US.msi |
~7.9 MB | Group Policy / silent installs, plain Windows Installer |
TRANCE.MUSIC_0.3.0_amd64.deb |
~7.9 MB | Debian/Ubuntu (dpkg -i or Software Center) |
TRANCE.MUSIC_0.3.0_amd64.AppImage |
~83 MB | Run anywhere on x64 Linux, no install |
TRANCE.MUSIC_0.3.0_aarch64.dmg |
~6.8 MB | Drag-to-Applications on Apple Silicon Macs |
Windows 10/11 x64 with WebView2 (preinstalled on Win 11). Linux x86_64 (the AppImage needs FUSE; the .deb registers the launcher). macOS 13+ on Apple Silicon. Existing installs upgrade in place - same com.openmusic.trancemusic identifier; your offline vault in Downloads/TRANCE MUSIC is never touched by installing or updating.
SmartScreen note: the updater package is signed with this project's release key (verified by the app before anything runs), but the installers built in CI are not yet Authenticode-signed - the certificate lives on the maintainer's machine, not the runner. On first run Windows may show "Windows protected your PC" / unknown publisher - click More info → Run anyway.
macOS note: the
.dmgis not Apple-notarized. On first launch right-click → Open (or clear the quarantine flag withxattr -d com.apple.quarantine). The signed updater bundle inside is verified by the app before anything runs.
Highlights
- First Linux + macOS builds - the Release workflow builds all three OSes in parallel from one tag push: NSIS + MSI on Windows,
.deb+ AppImage on Ubuntu,.dmg+ signed updater bundle on macOS. - Mobile UI polish - the Home header drops the STUDIO badge for the REON logo mark; the mini player no longer overlaps Now Playing; the square header dot is gone from all 7 Library-family screens; the Offline Vault storage/telemetry card is removed; the lyrics card fits ~3 lines with the active line centred; Now Playing queue rows get a kebab menu (play next, add to queue/playlist, remove from queue), a live Up Next count, and a working View Queue link.
- Updates now resolve on mobile -
update_checkregisters on Android (GitHub REST path with a 5-minute cache and rate-limit-friendly errors); install/rollback stay desktop-only. - A release pipeline that verifies itself - the manifest builder now uses GitHub's stored asset names (spaces → dots, matching the uploader's rule), and a new CI gate resolves every manifest URL after the binaries land but before the manifests attach. A manifest whose URLs don't resolve can no longer ship. The iOS workflow is manual-only (no more simulator builds riding desktop release tags).
Fixed
- Tagged releases 404'd in-app updates:
latest.json/update.jsonpointed at space-encoded asset names GitHub never stores. Manifests now reference the stored (dotted) names, guarded by the new verify step. - Pre-existing
cargo fmtdrift and twoclippy -D warningserrors (lyrics doc list,sort_by→sort_by_key) - CI is fully green.
Verification
- Rust: 138 unit tests,
cargo fmt --check,clippy --all-targets -D warnings,cargo audit. - Frontend: 58 tests under
node --test, ESLint, per-modulenode --check. - Release guard: every manifest URL is HEAD-checked against the live release before
latest.json/update.jsonattach; tag/version mismatch still fails the run loudly.
Upgrade
From v0.2.0: use Settings → Updates in-app (the update manifest now ships with every release, so v0.3.0 installs in place with signature verification), or install the new build over the old one. This is the first release carrying its own per-tag update.json, so v0.3.0 is a valid Revert target going forward.
Known gaps
- CI-built installers skip Authenticode until the certificate is imported on the runner (SmartScreen prompt persists); the macOS build is not Apple-notarized (Gatekeeper prompt on first launch).
- Releases published before v0.2.0 carry no signed update package - they appear in the revert list but can only be reinstalled from the assets here.
- Radio / endless-playback backend is landed but not wired to the UI.
- Tailwind and the icon font still load from a CDN at runtime.
TRANCE MUSIC v0.2.0
Title: TRANCE MUSIC v0.2.0
Second packaged release — the app now updates itself, caches what it plays,
and opens on Home.
Install
| File | Size | Best for |
|---|---|---|
TRANCE.MUSIC_0.2.0_x64-setup.exe |
~2.1 MB | Double-click install with Start-menu shortcut wizard |
TRANCE.MUSIC_0.2.0_x64_en-US.msi |
~3.0 MB | Group Policy / silent installs, plain Windows Installer |
Windows 10/11 x64 with WebView2 (preinstalled on Win 11). Existing installs
upgrade in place — same com.openmusic.trancemusic identifier; your offline
vault in Downloads/TRANCE MUSIC is never touched by installing or updating.
SmartScreen note: the updater package is signed with this project's
release key (verified by the app before anything runs), but the installers
built in CI are not yet Authenticode-signed — the certificate lives on the
maintainer's machine, not the runner. On first run Windows may show
"Windows protected your PC" / unknown publisher — click More info →
Run anyway. Importing the CA-issued certificate into the release workflow
(and the SmartScreen reputation that follows) is planned.
Highlights
-
In-app updates (Settings → Updates) — the app checks GitHub for a new
release once a day and shows a single toast per version. The Updates panel
reports the running build vs the latest, shows release notes, and installs
the signed package with a live download → signature-verify progress bar;
the passive installer runs and the new version relaunches. Every package is
verified against the release public key pinned intauri.conf.json— a
tampered asset fails the signature check and nothing executes. -
Revert back — the same panel lists the last published releases with a
Revert button (the running one marked Current): point the updater at
an older tag's own signed manifest and step back (or jump) to any other
build in place. Reverting installs over the current copy; the vault and all
settings stay as they are. -
Signed release pipeline — pushing a tag (
V*/v*) now runs the new
Release workflow: Windows build → updater packages signed from the keypair
stored in repo secrets →latest.json(fixedreleases/latestendpoint)
and per-tagupdate.json(rollback target) assembled → installers,
.sigfiles and both manifests attached to the GitHub release. The script
refuses a tag that disagrees withtauri.conf.json's version. -
Offline cache (L1–L5) — resolved stream links live 30 minutes, search
and entity metadata 6 hours, lyrics 7 days; underneath, a disk tier bounded
by a budget (default 500 MB, 100 MB–5 GB) sits in the app's own cache
directory. Settings → Storage shows live usage (covers, lyrics, vault),
the size selector, and a Clear cache button that drops every cache tier
while leaving the vault alone. The budget is enforced at boot and every
10 minutes; a disabled disk cache degrades to memory-only. -
Self-healing streams — the local relay re-resolves a song when the CDN
returns 403/410: the stale entry is purged, one fresh resolution is
attempted, and playback proceeds (the original 403 is preserved if
re-resolution fails). Artwork goes through the same relay's/artroute
with an origin guard (http/https only, private networks refused), MIME
sniffing, a 10 MB cap, and 24-hourCache-Control. -
Prefetch while you listen — the next track (including the crossfade
target) is probed and warmed in the background, so the handover starts at
320 kbps instead of waiting on a cold start. -
Home is the landing screen — the app opens on Home (greeting, Jump
Back In, playlists, charts); Search stays one click / shortcut away and
still seeds its last query in the background. -
Leaner screens — search results no longer repeat themselves under a
grouped Albums / Artists / Playlists panel (one flat result list plus the
inline suggestion dropdown remains), and Home drops the duplicated
Sonic Domains / Sub-Genres strips. Recent-search chips on Home stay. -
App icon fixed — all 15 PNG sizes plus
icon.icoregenerated with the
correct shading and fit (no more cropped/off-palette taskbar and installer
icons).
Verification
- Rust: 127 unit tests,
cargo fmt --check,clippy --all-targets -D warnings,
cargo audit. - Frontend: 30 tests under
node --test, ESLint, per-modulenode --check. - Release guard: manifest script dry-runs against the bundle tree and fails a
version/tag mismatch before anything is published.
Upgrade
From v0.1.0: install the new build over it (same identifier) or — once v0.2.0
is running — use Settings → Updates for every release after that. The
update manifest ships with the new release, so 0.1.0 → 0.2.0 updates
in-app; rollback targets exist for releases published from v0.2.0 onward.
Known gaps
- Releases published before v0.2.0 carry no signed update package — they
appear in the revert list but can only be reinstalled from the assets here. - CI-built installers skip Authenticode until the certificate is imported on
the runner (SmartScreen prompt persists). - Radio / endless-playback backend is landed but not wired to the UI.
- Tailwind and the icon font still load from a CDN at runtime.
TRANCE MUSIC v0.1.0
Title: TRANCE MUSIC v0.1.0
First packaged release of TRANCE MUSIC — a Tauri 2 desktop player for Windows
with a Rust core and a zero-build vanilla-JS frontend.
Install
| File | Size | Best for |
|---|---|---|
TRANCE MUSIC_0.1.0_x64_en-US.msi |
2.98 MB | Group Policy / silent installs, plain Windows Installer |
TRANCE MUSIC_0.1.0_x64-setup.exe |
2.05 MB | Double-click install with Start-menu shortcut wizard |
Windows 10/11 x64 with WebView2 (preinstalled on Win 11). Existing installs
upgrade in place — same com.openmusic.trancemusic identifier.
SmartScreen note: both installers are Authenticode-signed (SHA-256,
RFC 3161 timestamped), but with a self-signedTRANCE MUSICcertificate.
On first run Windows may show "Windows protected your PC" /
unknown publisher — click More info → Run anyway, or install from
source. Signing with a CA-issued certificate (and the SmartScreen
reputation that follows) is planned.
Highlights
- Settings → General — profile name (greets you by name on Home),
open-at-startup (HKCU Run key, no elevation), and language/country
preferences applied to every catalog request, with safe fallback so a
language filter never blanks a search that had results. - Desktop widget — a floating obsidian-glass player surface that can be
pinned onto the wallpaper; it drives the same player state as the main
window, so the three surfaces can't disagree. - Settings dialog — Open-Source Licences (read from
Cargo.lock,
469-crate tree named), About, and Terms. - Track credits dialog, toast/notification redesign, and miniplayer →
Now Playing navigation. - Packaging —
npm run tauri buildnow emits signed.msi+ NSIS
installers from an optimised release profile (LTO, single codegen unit,
stripped,panic = abort); cold build ≈ 5 min.
Fixed
- Tab switches no longer resume at the previous view's scroll position.
- Active nav tab rendered dark-on-dark (Tailwind cascade order).
- Playlist cards printed
[object Object]; playlist clicks hijacked the
Playlists tab; dead "View All" / History / Full-100-Charts links. - Uniform 96px artwork in every list row.
Known gaps
- No frontend test suite yet (Rust side: 62 unit tests).
- Radio / endless-playback backend is landed but not wired to the UI.
- Tailwind + icon font load from a CDN at runtime.