repository: https://github.com/peerloomllc/peartune name: PearTune summary: Your music collection, playable anywhere, without exposing your server to the internet description: | PearTune plays the music library on a machine you own - an Umbrel, a NAS, an old desktop, a laptop - from anywhere, over a direct encrypted connection between your phone and that machine. No port forwarding, no VPN, no dynamic DNS, no account, and no copy of your library in anyone's cloud. The music never leaves your hardware: it streams through the live connection while it plays. It reads the library you already have. Point it at Navidrome, Jellyfin, Emby or anything else that speaks the Subsonic API and it uses your tags, your artwork and the server's transcoding. Or point it at a plain folder of files and PearTune reads the tags itself - artist, album, track number, year and embedded cover art - so a folder is a real library, not a list of filenames. Features: - Browse by artist, album, genre or track, with artwork - Gapless playback, shuffle and repeat, a sleep timer, background and lock-screen audio - Search across the whole library - Playlists you make on the phone, plus the read-only ones your server already has - Favourites and resume points that follow you between your own devices, and playback that hands over rather than doubling up - starting on one device pauses the other - Offline caching: pin an album for a flight, and recent listening is kept - Ask the owner for music you cannot find, and see what they did with the request - Pair a phone by scanning a QR code - there is no password to type The library does not have to be yours. Someone can let a friend or a family member in, each as their own person with their own devices, their own favourites and their own resume points, and no login to pass around. The owner sees every device on their dashboard and can revoke one, or everything one person holds, in a second - mid-song, not "on next login". Nobody who is let in ever receives a copy of a file. Two things worth stating plainly. First, PearTune needs that machine running the PearTune host - it is the source of the music, so this is not a player for files on your phone. Second, some networks stop a phone and a host connecting directly. When that happens PearTune can fall back to a relay PeerLoom runs, which forwards encrypted data it cannot read and keeps no copy of it. Your phone always tries a direct connection first. When the relay is the only route to a library, PearTune asks before streaming that library's music through it and remembers your answer. Browsing that library goes over the relay without asking, which is a much smaller amount of data and is stated here rather than left for you to assume. One switch in Settings turns the relay off entirely. tags: - music - audio - selfhosted - privacy - p2p - nostr license: MIT website: https://peerloomllc.com/peartune/ images: - metadata/store/android/scene-2.webp - metadata/store/android/scene-3.webp - metadata/store/android/scene-4.webp - metadata/store/android/scene-5.webp - metadata/store/android/scene-6.webp # WHY THESE ARE COMMITTED WHEN NOTHING ELSE UNDER metadata/ IS, and why there are five. # # The first Zapstore listing went up with no pictures at all. Not the release script and not a # missing credential: this file had no `images:` block, because the only screenshots that existed # rendered REAL commercial album art out of a real library. That cannot live in a public MIT repo, # so the captures are gitignored, so this file could not point at them - and the publish did # exactly what it was told. # # Fixed by INVENTING the library: scripts/make-screenshot-fixture.js draws 40 albums that belong # to nobody, deterministically, so anyone can regenerate exactly what shipped. These five are the # framed output, converted to WebP - 320 KB the whole set, against 15 MB of PNGs. # # FIVE, NOT SIX. Scene 1 is the full-screen player, and on a freshly wiped device it captures the # MINI player instead - the one frame whose entire subject is the artwork. Three attempted fixes # on 2026-08-12 did not change it and the cause is not yet understood; see TODO.md. Shipping the # five that are right beats holding the listing hostage to the sixth. # # Regenerate: # node scripts/make-screenshot-fixture.js && ./scripts/android-screenshots.sh # then convert metadata/android/screenshots/Pixel_9_Framed/dark/*.png to WebP into here. metadata_sources: - github