Take your Jellyfin music offline on MP3 players and storage devices
TypeScript
35
734 commits
updated Sep 29, 2026
Take your Jellyfin music offline on MP3 players and storage devices.
JellyTunes is a desktop app for Jellyfin users who want their music offline. Browse the artists, album artists, albums, playlists and genres on your server, pick a destination such as an MP3 player, a USB drive, an SD card or any local folder, and hit sync. JellyTunes downloads the tracks, converts formats when needed, embeds lyrics and cover art, and mirrors your server's folder structure at the destination.
.lrc sidecar files or embed lyrics directly into tracks (supports Jellyfin 10.9+ JSON lyrics); mode is configurable per devicecover.jpg files; chosen per device and persistedBrowse your library · Pick a destination device or folder
Review what will change · Sync with live, phase-aware progress
Linux · installs in one command, updates arrive on their own
Prefer a direct download? Every platform is built on each release — grab yours from the latest release:
| Platform | File | Notes |
|---|---|---|
| macOS | .dmg | Apple silicon and Intel |
| Windows | .exe | Installer |
| Linux | .deb | Debian and Ubuntu |
| Linux | .AppImage | AppImage (legacy) — see Linux installation and migration |
Open the installer and follow the prompts. FFmpeg is bundled with every package, so there is nothing else to install.
sudo snap install jellytunes
The .snap is not attached to the release on purpose: a file downloaded from GitHub carries no store signature and snap install will reject it. Use the Snap Store button above, or the command.
Syncing to USB drives and SD cards needs the removable-media interface. Most systems connect it on install; if yours doesn't, JellyTunes says so at startup and gives you the command.
The .deb is equally supported and runs unconfined, which matters if your desktop has no working Secret portal and JellyTunes keeps asking you to log in. AppImage still runs but is deprecated. Both cases, and the migration path off AppImage, are covered in Linux installation and migration.
macOS blocks JellyTunes the first time you open it. What it says depends on your Mac:
| Your Mac | What you see |
|---|---|
| Apple silicon (M1 and later) | "JellyTunes is damaged and can't be opened. You should move it to the Bin." |
| Intel | "JellyTunes can't be opened because it is from an unidentified developer." |
On Apple silicon, "damaged" does not mean the download is broken. It is the wording macOS uses for any quarantined app it cannot verify, and JellyTunes cannot be verified because it is not signed with an Apple Developer certificate. Mac OS builds have been confirmed to install and run on Apple silicon after the steps below.
Click Cancel, not Move to Bin, and then:
.dmg and drag JellyTunes into your Applications folder.xattr -cr /Applications/JellyTunes.app
That command clears the com.apple.quarantine flag your browser attaches to anything it downloads. You need it once per install, and again after each update.
On Intel Macs you can avoid Terminal: try to open the app, then go to System Settings → Privacy & Security and click "Open Anyway" next to the JellyTunes entry. Apple silicon usually offers no such button for the "damaged" error, so use the command above.
Signing the app so macOS stops asking requires a paid Apple Developer account, which JellyTunes does not have yet. Until then this step is unavoidable — it is not a bug. See issue #12 for the background.
JellyTunes is not signed with a code-signing certificate, so Windows SmartScreen may show a blue "Windows protected your PC" warning the first time you run the installer. To proceed:
This only happens on first run.
Everything below is for contributors and developers who want to build JellyTunes from source.
git clone https://github.com/orainlabs/jellytunes.git
cd jellytunes
pnpm install
pnpm dev
This starts the Vite dev server and launches the Electron window.
Requirements: Node.js 18+ and pnpm
# Development
pnpm dev # Start dev server + Electron
pnpm build # Compile with electron-vite
pnpm typecheck # TypeScript type checking
# Testing
pnpm test # Unit tests (Vitest)
pnpm test:unit:watch # Unit tests in watch mode
pnpm test:e2e # E2E tests with Playwright (see docs/E2E_TESTING.md)
# Packaging
pnpm package # Build + create installers
Three Electron processes plus a standalone sync engine:
src/main/) — IPC handlers, USB/filesystem detection, sync orchestrationsrc/preload/) — typed IPC bridge between main and renderersrc/renderer/) — React UI for library navigation, device selection, and sync progresssrc/sync/) — dependency-injected sync engine (API client, file ops, FFmpeg converter); fully unit-testable without hitting the network or filesystemSee CONTRIBUTING.md for guidelines on reporting bugs, submitting changes, and code style.
This project is licensed under the GNU General Public License v3.0 — see the LICENSE file for details.
TypeScript
97.4%
JavaScript
2.1%
Take your Jellyfin music offline on MP3 players and storage devices
TypeScript
35
734 commits
updated Sep 29, 2026
Take your Jellyfin music offline on MP3 players and storage devices.
JellyTunes is a desktop app for Jellyfin users who want their music offline. Browse the artists, album artists, albums, playlists and genres on your server, pick a destination such as an MP3 player, a USB drive, an SD card or any local folder, and hit sync. JellyTunes downloads the tracks, converts formats when needed, embeds lyrics and cover art, and mirrors your server's folder structure at the destination.
.lrc sidecar files or embed lyrics directly into tracks (supports Jellyfin 10.9+ JSON lyrics); mode is configurable per devicecover.jpg files; chosen per device and persistedBrowse your library · Pick a destination device or folder
Review what will change · Sync with live, phase-aware progress
Linux · installs in one command, updates arrive on their own
Prefer a direct download? Every platform is built on each release — grab yours from the latest release:
| Platform | File | Notes |
|---|---|---|
| macOS | .dmg | Apple silicon and Intel |
| Windows | .exe | Installer |
| Linux | .deb | Debian and Ubuntu |
| Linux | .AppImage | AppImage (legacy) — see Linux installation and migration |
Open the installer and follow the prompts. FFmpeg is bundled with every package, so there is nothing else to install.
sudo snap install jellytunes
The .snap is not attached to the release on purpose: a file downloaded from GitHub carries no store signature and snap install will reject it. Use the Snap Store button above, or the command.
Syncing to USB drives and SD cards needs the removable-media interface. Most systems connect it on install; if yours doesn't, JellyTunes says so at startup and gives you the command.
The .deb is equally supported and runs unconfined, which matters if your desktop has no working Secret portal and JellyTunes keeps asking you to log in. AppImage still runs but is deprecated. Both cases, and the migration path off AppImage, are covered in Linux installation and migration.
macOS blocks JellyTunes the first time you open it. What it says depends on your Mac:
| Your Mac | What you see |
|---|---|
| Apple silicon (M1 and later) | "JellyTunes is damaged and can't be opened. You should move it to the Bin." |
| Intel | "JellyTunes can't be opened because it is from an unidentified developer." |
On Apple silicon, "damaged" does not mean the download is broken. It is the wording macOS uses for any quarantined app it cannot verify, and JellyTunes cannot be verified because it is not signed with an Apple Developer certificate. Mac OS builds have been confirmed to install and run on Apple silicon after the steps below.
Click Cancel, not Move to Bin, and then:
.dmg and drag JellyTunes into your Applications folder.xattr -cr /Applications/JellyTunes.app
That command clears the com.apple.quarantine flag your browser attaches to anything it downloads. You need it once per install, and again after each update.
On Intel Macs you can avoid Terminal: try to open the app, then go to System Settings → Privacy & Security and click "Open Anyway" next to the JellyTunes entry. Apple silicon usually offers no such button for the "damaged" error, so use the command above.
Signing the app so macOS stops asking requires a paid Apple Developer account, which JellyTunes does not have yet. Until then this step is unavoidable — it is not a bug. See issue #12 for the background.
JellyTunes is not signed with a code-signing certificate, so Windows SmartScreen may show a blue "Windows protected your PC" warning the first time you run the installer. To proceed:
This only happens on first run.
Everything below is for contributors and developers who want to build JellyTunes from source.
git clone https://github.com/orainlabs/jellytunes.git
cd jellytunes
pnpm install
pnpm dev
This starts the Vite dev server and launches the Electron window.
Requirements: Node.js 18+ and pnpm
# Development
pnpm dev # Start dev server + Electron
pnpm build # Compile with electron-vite
pnpm typecheck # TypeScript type checking
# Testing
pnpm test # Unit tests (Vitest)
pnpm test:unit:watch # Unit tests in watch mode
pnpm test:e2e # E2E tests with Playwright (see docs/E2E_TESTING.md)
# Packaging
pnpm package # Build + create installers
Three Electron processes plus a standalone sync engine:
src/main/) — IPC handlers, USB/filesystem detection, sync orchestrationsrc/preload/) — typed IPC bridge between main and renderersrc/renderer/) — React UI for library navigation, device selection, and sync progresssrc/sync/) — dependency-injected sync engine (API client, file ops, FFmpeg converter); fully unit-testable without hitting the network or filesystemSee CONTRIBUTING.md for guidelines on reporting bugs, submitting changes, and code style.
This project is licensed under the GNU General Public License v3.0 — see the LICENSE file for details.
TypeScript
97.4%
JavaScript
2.1%