A music player for your own Jellyfin server, native on the Linux desktop, in sync with Aoide on iPhone.
Install · Features · Privacy · The Aoide family · Building · Security · Changelog
Aoide plays the music on your Jellyfin server and keeps what is yours on your computer: playlists, likes, taste flags and a play history. With the Aoide sidecar plugin on the server, all of that syncs with the iPhone app, so a playlist made on the phone is on the desk, and a play at the desk counts on the phone.
It is written from scratch in Rust with iced. No code from Feishin or the Electron-based Aoide desktop app is copied here.
Status: 0.1.0 is the first release, made for testing beside the Electron app. TRACKER.md lists every feature and how far it has been checked. Several desktop pieces (MPRIS, the tray, the keyring) have run in CI or on macOS but not yet on a Linux desktop.
|
|
![]() |
![]() |
![]() |
![]() |
The screenshots show a stand-in test server with made-up artists, albums and lyrics.
- Aoide for iPhone: the iOS app, in SwiftUI, with CarPlay and Siri.
- Aoide for Linux (this repository): the desktop app, in Rust.
- Aoide sidecar: the Jellyfin plugin both apps sync through. Optional: without it, the apps still play music and keep playlists on the device.
Aoide was one of the three original Muses in Greek myth; the name means "song".
Every release is built
by GitHub Actions for x86_64. The app installs as the command aoide-linux, so
it can sit beside the Electron app.
Add the repository to /etc/pacman.conf:
[aoide-linux]
SigLevel = Optional TrustAll
Server = https://github.com/Virel0/Aoide-Linux/releases/latest/downloadThen install it, and from then on it updates with the rest of the system:
sudo pacman -Syu aoide-linuxReleases are not signed yet, which is why SigLevel is relaxed. Each release
carries SHA256SUMS files, and docs/releases.md has the
stricter lines to use once a release key exists. Optional packages: a Secret
Service provider such as GNOME Keyring or KWallet, which keeps you signed in
between launches, and noto-fonts-cjk for Japanese, Chinese and Korean text.
curl -LO https://github.com/Virel0/Aoide-Linux/releases/latest/download/aoide-linux.flatpak
flatpak install --user aoide-linux.flatpak
flatpak run io.github.Virel0.Aoide.LinuxThe bundle uses the freedesktop 26.08 runtime from Flathub. It does not update itself: install the next release's bundle the same way. The Flatpak builds in CI but has not yet been run on a desktop.
Download aoide-linux-<version>-x86_64.AppImage or
aoide-linux_<version>_amd64.deb from the
latest release. Both
need glibc 2.35 or later (Ubuntu 22.04, Debian 12 and newer). The AppImage
bundles no libraries: it uses the system's ALSA, D-Bus, and Wayland or X11.
sha256sum --check --ignore-missing SHA256SUMS-appimage-deb
chmod +x aoide-linux-*-x86_64.AppImage && ./aoide-linux-*-x86_64.AppImage
sudo apt install ./aoide-linux_*_amd64.deb- Open Aoide from the app menu, or run
aoide-linux. - Type your server's address, or press Find servers on this network. Home
addresses (
jellyfin.local, a local network IP) connect over plain HTTP; anything else uses HTTPS. - Sign in with your Jellyfin username and password.
Ctrl+K opens the command palette from anywhere. Tab moves between fields and Escape closes what is on top.
Aoide has no account of its own and no analytics. It talks to your server, and to other services only for the features below.
| Where | What is sent | When |
|---|---|---|
| Your Jellyfin server | Sign-in, library requests, streams, playback reports | Always; Private listening stops the reports |
| The Aoide sidecar, on the same server | The sync log, the queue for handoff, requests for measurements, Infinity and Discover | When the plugin is installed |
| LRCLIB | Title, first artist, album and length of a song your server has no lyrics for | On by default; Settings → Lyrics → Find lyrics on the internet |
| Your LibreTranslate server | The lyric lines, your language and the key | Only when you set a server and turn on Translate |
| OpenRouter | The phrase you typed, or a mix's description, with your library's genre names | Only with a key set, and only when you press the button |
| Discord, through its local socket | The song and artist; the cover's address only if it is public HTTPS | Only while Rich Presence is on |
| GitHub's API | One unauthenticated request for the latest release, with a fixed user agent, at most once a day | On by default; Settings → System → Updates → Check for updates |
| Spotify | A request for the public playlist page you paste | Only when you import a playlist |
What stays on the computer: the sign-in token and any API keys in the system
keyring (the Secret Service, or the Secret portal inside the Flatpak); settings
in ~/.config/aoide/config.json; the play history, playlists, taste flags and
sync log in ~/.local/share/aoide/aoide.sqlite; artwork and 30 days of LRCLIB
answers in ~/.cache/aoide. SECURITY.md has the details.
cargo run -p aoide-appRust 1.98 or later. Linux needs the ALSA and D-Bus development headers
(alsa-lib and dbus on Arch, libasound2-dev and libdbus-1-dev on Debian
and Ubuntu). The default build includes furigana, which fetches the IPADIC
dictionary at build time and adds about 48 MB to the binary.
The checks CI runs:
cargo fmt --all --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspaceCONTRIBUTING.md has the rest: the D-Bus and keyring tests, and the packaging checks.
| Crate | What it holds |
|---|---|
aoide-jellyfin |
Jellyfin HTTP client |
aoide-lyrics |
Internet lyrics (LRCLIB) for tracks the server has none for, and LRC parsing |
aoide-sidecar |
Aoide sidecar client: sync, Infinity, Discover, measurements |
aoide-store |
Local SQLite store: history, playlists, taste flags, op log |
aoide-audio |
Decoding, output, gapless, crossfade, loudness |
aoide-mpris |
The Linux desktop: MPRIS media controls, tray icon, single instance, sleep inhibit |
aoide-integrations |
Services outside the server: Discord Rich Presence, OpenRouter (search by description, mixes), lyric translation, update notice |
aoide-app |
The iced application |
What is ported from the Electron app, and what is still to come, is in TRACKER.md. Release signing and checksums are in docs/releases.md, and the LibreTranslate setup in docs/translation.md.
GPL-3.0-or-later; see LICENSE. The bundled Inter font
(crates/aoide-app/fonts) is under the SIL Open Font License 1.1; its licence
is beside it.



