[READ-ONLY] Mirror of https://github.com/probablykasper/ferrum. Music library app for Mac, Linux and Windows ferrum.kasper.space
electron linux macos music music-library music-player napi windows
0

Configure Feed

Select the types of activity you want to include in your feed.

website: Improve download button

Kasper (Mar 18, 2026, 3:44 PM +0100) a3e60af2 4cfd364e

+14 -9
+2 -2
README.md
··· 5 5 <p align="center"> 6 6 Music library and player 7 7 <br/> 8 - <a href="https://ferrum.kasper.space"><b>Download for Mac, Windows or Linux</b></a> 8 + <a href="https://ferrum.kasper.space"><b>Download for Mac, Linux, Windows or Android</b></a> 9 9 </p> 10 10 11 11 <br/> ··· 24 24 25 25 The Android app is not useful yet, unless you just want you browse your library. There's no playback or syncing. You have to manually copy over your Library.json file. 26 26 27 - <a href="https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/%7B%22id%22%3A%22space.kasper.ferrum%22%2C%22url%22%3A%22https%3A%2F%2Fgithub.com%2Fprobablykasper%2Fferrum%22%2C%22author%22%3A%22probablykasper%22%2C%22name%22%3A%22Ferrum%22%2C%22preferredApkIndex%22%3A0%2C%22additionalSettings%22%3A%22%7B%5C%22includePrereleases%5C%22%3Afalse%2C%5C%22fallbackToOlderReleases%5C%22%3Atrue%2C%5C%22filterReleaseTitlesByRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22filterReleaseNotesByRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22verifyLatestTag%5C%22%3Afalse%2C%5C%22sortMethodChoice%5C%22%3A%5C%22date%5C%22%2C%5C%22useLatestAssetDateAsReleaseDate%5C%22%3Afalse%2C%5C%22releaseTitleAsVersion%5C%22%3Afalse%2C%5C%22trackOnly%5C%22%3Afalse%2C%5C%22versionExtractionRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22matchGroupToUse%5C%22%3A%5C%22%5C%22%2C%5C%22versionDetection%5C%22%3Atrue%2C%5C%22releaseDateAsVersion%5C%22%3Afalse%2C%5C%22useVersionCodeAsOSVersion%5C%22%3Afalse%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22invertAPKFilter%5C%22%3Afalse%2C%5C%22autoApkFilterByArch%5C%22%3Atrue%2C%5C%22appName%5C%22%3A%5C%22%5C%22%2C%5C%22appAuthor%5C%22%3A%5C%22%5C%22%2C%5C%22shizukuPretendToBeGooglePlay%5C%22%3Afalse%2C%5C%22allowInsecure%5C%22%3Afalse%2C%5C%22exemptFromBackgroundUpdates%5C%22%3Afalse%2C%5C%22skipUpdateNotifications%5C%22%3Afalse%2C%5C%22about%5C%22%3A%5C%22%5C%22%2C%5C%22refreshBeforeDownload%5C%22%3Afalse%2C%5C%22includeZips%5C%22%3Afalse%2C%5C%22zippedApkFilterRegEx%5C%22%3A%5C%22%5C%22%7D%22%2C%22overrideSource%22%3A%22GitHub%22%7D"><img alt="Get it on Obtainium" height="80" src="https://github-production-user-asset-6210df.s3.amazonaws.com/30463115/393344052-713d71c5-3dec-4ec4-a3f2-8d28d025a9c6.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAVCODYLSA53PQK4ZA%2F20260306%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260306T105704Z&X-Amz-Expires=300&X-Amz-Signature=40b1697b23ba74e2f6b28e74746797344b5947d7f1fa5fa507f4ad624d7cbde6&X-Amz-SignedHeaders=host"></a> 27 + <a href="https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/%7B%22id%22%3A%22space.kasper.ferrum%22%2C%22url%22%3A%22https%3A%2F%2Fgithub.com%2Fprobablykasper%2Fferrum%22%2C%22author%22%3A%22probablykasper%22%2C%22name%22%3A%22Ferrum%22%2C%22preferredApkIndex%22%3A0%2C%22additionalSettings%22%3A%22%7B%5C%22includePrereleases%5C%22%3Afalse%2C%5C%22fallbackToOlderReleases%5C%22%3Atrue%2C%5C%22filterReleaseTitlesByRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22filterReleaseNotesByRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22verifyLatestTag%5C%22%3Afalse%2C%5C%22sortMethodChoice%5C%22%3A%5C%22date%5C%22%2C%5C%22useLatestAssetDateAsReleaseDate%5C%22%3Afalse%2C%5C%22releaseTitleAsVersion%5C%22%3Afalse%2C%5C%22trackOnly%5C%22%3Afalse%2C%5C%22versionExtractionRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22matchGroupToUse%5C%22%3A%5C%22%5C%22%2C%5C%22versionDetection%5C%22%3Atrue%2C%5C%22releaseDateAsVersion%5C%22%3Afalse%2C%5C%22useVersionCodeAsOSVersion%5C%22%3Afalse%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22invertAPKFilter%5C%22%3Afalse%2C%5C%22autoApkFilterByArch%5C%22%3Atrue%2C%5C%22appName%5C%22%3A%5C%22%5C%22%2C%5C%22appAuthor%5C%22%3A%5C%22%5C%22%2C%5C%22shizukuPretendToBeGooglePlay%5C%22%3Afalse%2C%5C%22allowInsecure%5C%22%3Afalse%2C%5C%22exemptFromBackgroundUpdates%5C%22%3Afalse%2C%5C%22skipUpdateNotifications%5C%22%3Afalse%2C%5C%22about%5C%22%3A%5C%22%5C%22%2C%5C%22refreshBeforeDownload%5C%22%3Afalse%2C%5C%22includeZips%5C%22%3Afalse%2C%5C%22zippedApkFilterRegEx%5C%22%3A%5C%22%5C%22%7D%22%2C%22overrideSource%22%3A%22GitHub%22%7D"><img alt="Get it on Obtainium" height="80" src="https://github.com/user-attachments/assets/713d71c5-3dec-4ec4-a3f2-8d28d025a9c6"></a> 28 28 29 29 ## Dev instructions 30 30
+12 -7
website/src/routes/Download.svelte
··· 18 18 const linux_rpm: Version = { os: 'Linux', arch: '.rpm', ending: 'linux-x86_64.rpm' } 19 19 const android_obtainium: Version = { os: 'Obtainium', arch: '', ending: '' } 20 20 const android_arm64: Version = { os: 'Android', arch: 'arm64', ending: '-android-arm64.apk' } 21 - const android_x86_64: Version = { os: 'Android', arch: 'x86_64', ending: '-android-x86_64.apk' } 21 + const android_x86_64: Version = { os: 'Android', arch: 'x64', ending: '-android-x86_64.apk' } 22 22 23 23 const desktop_versions: Version[] = [ 24 24 macos_arm, ··· 182 182 {/if} 183 183 184 184 <div 185 - class="flex w-full max-w-xl items-stretch rounded-2xl border border-white/10 bg-white/[0.04]" 185 + class="flex w-full max-w-xl flex-col items-stretch rounded-2xl border border-white/10 bg-white/[0.04] sm:flex-row" 186 186 > 187 187 <!-- ── Desktop ── --> 188 188 <div class="relative z-10 flex flex-1 flex-col gap-2.5 p-5"> ··· 201 201 > 202 202 Desktop 203 203 </div> 204 - <p class="-mt-1 text-xs leading-snug text-white/0 select-none" aria-hidden="true">.</p> 204 + <p 205 + class="-mt-1 text-xs leading-snug text-white/0 select-none not-sm:hidden" 206 + aria-hidden="true" 207 + > 208 + . 209 + </p> 205 210 206 211 <ButtonPopup let:toggle let:isOpen let:close> 207 212 <div ··· 255 260 256 261 <div 257 262 slot="popup" 258 - class="dropdown absolute top-full right-0 left-0 overflow-hidden rounded-b-[10px] border border-t-0 border-white/20 bg-white/5 backdrop-blur-xl" 263 + class="dropdown absolute top-full right-0 left-0 overflow-hidden rounded-b-[10px] border border-t-0 border-white/20 bg-white/5 backdrop-blur-md" 259 264 style="z-index: 9999;" 260 265 transition:scale={{ start: 0.95, opacity: 0, duration: 160 }} 261 266 > 262 267 {#each desktop_versions as version} 263 268 <button 264 269 type="button" 265 - class="dropdown-item flex h-9 w-full cursor-pointer items-center gap-2 bg-transparent px-3.5 text-left text-[13.5px] text-white/80 transition-colors duration-100 outline-none hover:bg-white/[0.06] hover:text-white" 270 + class="dropdown-item flex h-9 w-full cursor-pointer items-center gap-2 bg-transparent px-3.5 text-left text-[13.5px] text-white/80 outline-none hover:bg-white/5 hover:text-white" 266 271 on:click={() => { 267 272 close() 268 273 download(version) ··· 292 297 </div> 293 298 294 299 <!-- vertical divider --> 295 - <div class="my-3.5 w-px shrink-0 bg-white/[0.08]"></div> 300 + <div class="shrink-0 bg-white/10 not-sm:mx-3.5 not-sm:h-px sm:my-3.5 sm:w-px"></div> 296 301 297 302 <!-- ── Android ── --> 298 303 <div class="relative z-[5] flex flex-1 flex-col gap-2.5 p-5"> ··· 316 321 href={obtainium_url} 317 322 target="_blank" 318 323 rel="noopener noreferrer" 319 - class="flex h-full cursor-pointer items-center gap-1.5 pr-3.5 pl-3 whitespace-nowrap text-white/70 transition-colors duration-150 outline-none hover:text-white" 324 + class="flex h-full grow cursor-pointer items-center gap-1.5 pr-3.5 pl-3 whitespace-nowrap text-white/70 transition-colors duration-150 outline-none hover:text-white" 320 325 > 321 326 <svg 322 327 width="14"