MCPcopy Index your code
hub / github.com/Fingel/gelly

github.com/Fingel/gelly @v1.9.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.9.0 ↗ · + Follow
1,054 symbols 2,357 edges 69 files 43 documented · 4%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README
<img width="150" height="150" src="https://github.com/user-attachments/assets/156e5858-a48e-4ea5-a4e4-6fbcd6644dd7" align="center" />





<strong style="font-size: 26px;">Gelly</strong>


<em>A native, lightweight music client for Jellyfin and Subsonic. Built with Rust and GTK.</em>
🦀🐧

gelly_june_2026

Features

  • [x] Supports both Jellyfin and Subsonic/Navidrome backends
  • [x] MPRIS
  • [x] Lyrics
  • [x] Replaygain
  • [x] Gapless playback
  • [x] Transcoding
  • [x] Translated to 13+ languages
  • [x] CLI
  • [x] Playlist management
  • [x] Favorites
  • [x] Smart Playlists
  • [x] NFC tag support

Installation

Flatpak

Get it on Flathub

Gelly is available on Flatpak as io.m51.Gelly

flatpak install io.m51.Gelly

Arch Linux

Gelly is available on the aur:

paru -S gelly

NixOS

nix-shell -p gelly

ALT Linux (Sisyphus)

sudo apt-get install gelly

Command line interface

Gelly has a few basic command line options that can be sent to the running instance. This is useful for light scripting or if you don't want to deal with the MPRIS interface. Note that most context menus have a "Copy ID" option which can be used as an argument to the --play-x options.

-n, --next                  Skip to the next track
-p, --prev                  Go to the previous track
-t, --play-pause            Toggle play/pause
-s, --stop                  Stop playback
-r, --refresh-library       Refresh the library
--play-album=ALBUM_ID       Play an album by ID
--play-artist=ARTIST_ID     Play all songs by an artist ID
--play-song=SONG_ID         Play a specific song by ID
--big-player                Open the big player

NFC Tag Support

Gelly doesn't directly support reading or writing NFC card but the project Gelly-NFC does. It's a simple Python script that can be used to control Gelly via NFC cards using the command line interface. Perfect for making a home Jukebox!

See this blog post for more details.

Connecting with TLS using self signed certificates

There is currently an issue with Flatpak that prevents sandboxed applications from reading the host's certificate store. This means if you are using a self-signed certificate on your Jellyfin/Navidrome install, Gelly will be unlikely to be able to connect even if you have the cert installed locally.

There is a workaround: You need to make the cert file available to the flatpak sandbox and then set the SSL_CERT_FILE env var to point to it. This can be done using a tool like Flatseal. Thank you @RodrigoPrestes for finding this workaround.

The other alternative is to use a non flatpak installation method.

Translations

Gelly needs help with translations! See the Weblate project page to submit translations via Weblate.

Translation status

Development

Make sure you have the development libraries for the following installed:

  • GTK
  • Libadwaita
  • Gstreamer

The name of these packages depends on your distribution, but will usually be something like gstreamer-dev. Note that Arch Linux includes development libs with the main package, btw, so you don't need to install anything extra.

Gelly leverages gtk-rs for GTK bindings.

You will also need a rust compiler installed. Gelly does not require any nightly features from Rust.

To make things easy, also install the just command runner. Building and launching a development build of Gelly should then simply be a matter of:

just

And installing a release build:

just release
sudo just install

See the recipes in the justfile for other useful commands.

Contributing

See CONTRIBUTING.md

Special Thanks

@gabMus for all the great UI work and polish

@dstapp for the Subsonic backend

Contact

I hang out on libera.chat in #gelly

Extension points exported contracts — how you extend this code

TopPage (Interface)
(no doc) [4 implementers]
src/ui/page_traits.rs
Cacheable (Interface)
(no doc) [3 implementers]
src/cache.rs
ItemModel (Interface)
(no doc) [3 implementers]
src/models/model_traits.rs
DetailPage (Interface)
(no doc) [3 implementers]
src/ui/page_traits.rs
PlayerImp (Interface)
(no doc) [3 implementers]
src/ui/player_bar/common.rs
WidgetApplicationExt (Interface)
(no doc) [1 implementers]
src/ui/widget_ext.rs

Core symbols most depended-on inside this repo

get
called by 131
src/jellyfin/mod.rs
get_application
called by 82
src/ui/widget_ext.rs
settings
called by 57
src/config.rs
id
called by 50
src/ui/page_traits.rs
audio_model
called by 41
src/ui/player_bar/big_player.rs
backend
called by 28
src/application.rs
spawn_tokio
called by 24
src/async_utils.rs
toast
called by 20
src/ui/window.rs

Shape

Method 797
Function 141
Class 93
Enum 17
Interface 6

Languages

Rust100%

Modules by API surface

src/audio/model.rs53 symbols
src/models/playlist_type.rs49 symbols
src/library.rs46 symbols
src/config.rs42 symbols
src/audio/mpris.rs41 symbols
src/jellyfin/mod.rs36 symbols
src/subsonic/mod.rs34 symbols
src/ui/window.rs32 symbols
src/ui/setup.rs31 symbols
src/jellyfin/api.rs31 symbols
src/ui/playlist_detail.rs30 symbols
src/ui/player_bar/full_player_bar.rs30 symbols

For agents

$ claude mcp add gelly \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page