GNOME keeps its media controls in the notification list. To reach them you open the calendar popover, scroll past the notifications, and find a small strip with a track title and three buttons. No artwork worth the name, no progress bar you can drag, and nothing in the top bar to tell you a track is running at all. I wanted that back where I can see it, so I wrote Now Playing Card: a GNOME Shell media card for any MPRIS player, drawn from what the players announce over D-Bus.
This post walks through what the extension does, how to install it before it clears the extensions.gnome.org review queue, and the two D-Bus details that took most of the work.

The Problem
Every player on Linux that can be driven from outside itself speaks MPRIS over D-Bus. On my machine that is Spotify, Firefox and Chromium, Rhythmbox, VLC, Amberol, Celluloid, and mpv once mpv-mpris is loaded. The data is all there on the bus:
busctl --user list | grep mpris
gdbus introspect --session \
--dest org.mpris.MediaPlayer2.spotify \
--object-path /org/mpris/MediaPlayer2GNOME Shell reads that bus already. What it draws from it is the strip in the notification list: title, artist, previous, play, next. The position property is never shown, so there is no scrubbing, and the artwork is rendered small enough that album covers are decoration rather than information.
What I Built
Two things: an animated equalizer in the top panel that appears while something plays, and a GNOME Shell media card behind it with cover art, a seekable progress bar, transport controls, and a volume slider for players that carry a volume of their own. There is nothing to configure to get going and nothing to install beside it. Enable it and it picks up whatever is already playing.
Panel behaviour is the part I use most. The top-bar button takes transport clicks, a scroll wheel and a middle click, so a track can be skipped or paused without opening anything. It can sit as its own button or be embedded at the bottom of Quick Settings, and the icon can be permanent, only-while-playing, or hidden.
How It Works
Cover art arrives in three different shapes
The mpris:artUrl field is a URL, and what that URL points at depends entirely on the player. Some hand over a file:// path in the cache directory, some a remote https:// address, some a data: URI with the image inline. Browsers are the awkward case: Firefox announces the track and writes the cache file a moment later, so reading the path immediately gives you nothing. The extension waits for the file instead of giving up on it. Flatpak players are the other case: the artwork can sit inside a sandbox the shell cannot read, and there the card falls back to the application icon rather than showing an empty square.
Whatever arrives fills the square it is given, cropped rather than squeezed, so a 300×300 cover and a 1400×900 video thumbnail both look deliberate.
Seeking needs two different calls
MPRIS has an absolute SetPosition and a relative Seek. SetPosition is the one you want, but it takes a track id as its first argument and silently does nothing if that id does not match the track the player thinks is current. Plenty of players report no usable id at all. So the progress bar uses SetPosition where there is an id to pass and computes an offset for Seek where there is not. Same drag, same result, two code paths.
Several players at once
Three players running is normal: a browser tab, a music player, and something paused from an hour ago. They share one popup as an accordion. The one playing keeps its card open, the rest wait as rows and open on a click, and a player that starts playing always gets one of the places. Three cards at once by default, up to ten if you want them. The popup keeps one width whatever the track is called, so nothing jumps between songs.

Local files with no tags
An untagged file played from disk reports the player’s own name on both lines of the card, which is useless. Those are named after the file instead. It is a small thing that took a while to notice and five minutes to fix.
Installation
Prerequisites
GNOME Shell 45 through 50, Wayland or X11, and nothing else. Check the version first:
gnome-shell --versionStep 1: install the zip
The extension is uploaded to extensions.gnome.org and still in review, so until it clears, grab the zip from a release. Every tag builds the same file that goes to the extensions site:
gnome-extensions install --force nowplaying@epogonii.github.io.shell-extension.zipOr build it from the sources, which is the same three commands the release workflow runs:
git clone https://github.com/epogonii/nowplaying-card
cd nowplaying-card
gnome-extensions pack --force \
--schema=schemas/org.gnome.shell.extensions.nowplaying.gschema.xml \
--extra-source=stylesheet.css --extra-source=stylesheet-light.css \
--extra-source=stylesheet-dark.css --extra-source=LICENSE \
--extra-source=icons
gnome-extensions install --force nowplaying@epogonii.github.io.shell-extension.zipStep 2: restart the shell
Do this before enabling it. A running shell keeps an extension’s JavaScript in memory for the life of the process, so new code needs a new shell. On X11, Alt+F2 then r is enough. On Wayland it has to be a full log out and back in.
Step 3: enable and verify
gnome-extensions enable nowplaying@epogonii.github.io
gnome-extensions info nowplaying@epogonii.github.io | grep StateExpected result: State: ACTIVE. Start any player and the equalizer appears in the panel, with the GNOME Shell media card one click behind it.
Preferences
gnome-extensions prefs nowplaying@epogonii.github.ioThe Card page decides how much of a card you get (accordion, always full, always compact), how many players the popup shows, the smallest artwork size, and whether the progress bar, volume slider and shuffle/repeat controls are drawn at all. Icon style lives here too: square ends, rounded ends, or bars that walk around the colour wheel while a track plays.
The Panel page is the one worth a minute. Location switches between an own button and Quick Settings, Show in the top bar takes always, only-while-playing or never, and Track in the panel takes nothing, the title, or artist and title. Text width is capped in pixels and can be held fixed so a short track title does not shrink the panel.
The Players page hides GNOME’s own controls and holds the ignore list, picked from installed applications or typed by hand.

Gotchas
- A browser announces every autoplaying video as a track. That is what the ignore list on the Players page is for: add the browser and the panel stops reacting to tabs.
- Skip buttons only appear when the player reports that it can skip. A missing button is the player saying no, not the card losing it.
- GNOME’s own media controls are hidden while the extension runs and handed straight back when it stops, so disabling the extension does not leave you with no controls at all.
- Preferences apply immediately. Only new extension code needs the shell restart.
If something misbehaves, the shell’s own log is where it says so:
journalctl --user -b 0 -o cat /usr/bin/gnome-shell | grep nowplayingAn issue is quick to fix with the extension version, your GNOME Shell version and distribution, the player and how it is installed, and that log.
Takeaways
- MPRIS is a standard that every player implements slightly differently. Anything reading it needs a fallback for artwork and a fallback for seeking.
SetPositionfails quietly without a matching track id. If a scrub does nothing, that is usually why.- Extension code is loaded once per shell process. Restart the shell before you conclude a change did not work.
- The panel button doing transport on scroll and middle click removed most of my reasons to open the GNOME Shell media card at all.
Links
- Source and issues: github.com/epogonii/nowplaying-card
- Licence: GPL-2.0-or-later
- The extension is free and stays free. If it earned a coffee: GitHub Sponsors or PayPal.
Status: the extension is submitted to extensions.gnome.org and still in the review queue. Until it clears, the release zip above is the way to install it.