Skip to content

v0.4.0 — Nothing to install, and a link you can send

Choose a tag to compare

@SAKMZ SAKMZ released this 27 Jul 11:38

Two things stood between "I found this repo" and "my friend is listening with me": having to install Node first, and having to figure out how to let someone outside your house reach it. Both are gone.

📦 Nothing to install

Download the ZIP, double-click start.bat (Windows) or run ./start.sh (macOS/Linux). That's it — there is no step 0.

If the machine has no Node.js, or one older than 20, the launcher fetches an official build from nodejs.org, verifies it against the published SHA-256, and unpacks it into a .runtime folder beside the app. Nothing is installed system-wide, nothing touches your PATH or registry, and deleting .runtime reverses it. An existing Node 20+ is used as-is.

The version is read from the current LTS manifest rather than pinned, so it keeps up on its own. ffmpeg and a JavaScript runtime were already bundled — now the runtime is too.

🌍 A link you can actually send someone

The public link is now the default. Listening together is the entire point, and the people you want to listen with are usually not on your Wi-Fi. The launcher prints an HTTPS URL from a Cloudflare quick tunnel — no account, no port forwarding, no domain. Pass --local to stay on your network.

Because a public URL changes the stakes, the tunnel waits until you've set an admin password. An unclaimed instance lets whoever arrives first claim it, which is fine on a LAN and not fine on the open internet. First run now opens /setup instead of the home page, so the thing standing between you and a shareable link is visible rather than buried.

  • 🔗 Share button in every room — shows the link that actually works for the person you're sending it to, not whatever is in your address bar. The host is almost always on localhost; copying that hands friends a dead link. It tells you plainly whether the room is reachable from anywhere or only on your network, and picks up the tunnel if it comes up after you opened the room.
  • 📖 Tailscale and bring-your-own-domain setups are documented in DEPLOY.md for a permanent address.

🛠️ Fixes

  • Desktop installs couldn't play anything. yt-dlp needs a JavaScript runtime to solve YouTube's player challenge; without one every track failed. A runtime now ships with the app. This was the single biggest reliability problem.
  • Rate limiting was reported as a permanent block. An HTTP 429 is temporary and now says so, instead of showing the "your IP is blocked" message and sending people off to export cookies they didn't need.
  • The launcher could corrupt its own build. Building while another copy was running rewrote files the live server had open, and you'd get a working-looking page whose stylesheet 400s. It now refuses to start when the port is busy, and --rebuild clears the previous output instead of building over it.
  • Cover art was blurry. The hero image was drawing a 120px thumbnail at several times its size; it now requests the size it actually renders.
  • Docker builds were broken by --omit=optional, which also drops the platform-native binaries npm ships as optional dependencies.

📸 Also

  • A real screenshot and a demo GIF in the README, instead of a description of one.

Get it: download the source ZIP below, unzip, and double-click start.bat or run ./start.sh.