Featured image of post How to Fix Spotify Notifications in Linux

How to Fix Spotify Notifications in Linux

Somewhere near Feb. 2026 notifications when changing a song in Spotify stopped working for me in Artix Linux. I don’t know if this is a general issue with Spotify, something specifically related to running it without systemd or simply something wrong with my system, but I created a workaround after looking through a couple of sources. Hopefully this can help you if you’re having the same issue.

The workaround basically consists in locally overriding the Spotify .desktop file to launch Spotify with a separate workaround script that handles notifications.

The workaround script

This is the script that handles notifications. Note that I’ve stored it under $HOME/.local/bin/spotify-notify and $HOME/.local/bin is part of my $PATH.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env bash

# As of Feb/2026 notifications are no longer supported
# natively via spotify, this is a workaround script that
# invokes a notification on song change.
# Heavily based on a script by scartiloffista
# https://community.spotify.com/t5/Desktop-Linux/Desktop-notifications-no-longer-work/td-p/7354304
# Monitor Spotify track changes via MPRIS and send notifications with album art.
# Requires: playerctl, libnotify (notify-send), curl, and a custom .desktop file

# enable job control so the backgrounded monitor job gets its own process group
set -m

tmp_icon=""

#cleanup() {
#    [[ -n "$tmp_icon" ]] && rm -f "$tmp_icon"
#}
#trap cleanup EXIT

monitor() {
    while IFS=$'\t' read -r track art_url; do
        [[ -z "$track" ]] && continue

        icon="spotify"

        if [[ -n "$art_url" ]]; then
            if [[ "$art_url" == file://* ]]; then
                icon="${art_url#file://}"
            elif [[ "$art_url" == http* ]]; then
                tmp_icon="/tmp/spotify-song-art.jpg"
                curl -sf -o "$tmp_icon" "$art_url" && icon="$tmp_icon"
            fi
        fi

        notify-send --icon="$icon" --app-name=Spotify "Now Playing" "$track" -r 999
    done < <(playerctl --player=spotify --follow metadata --format $'{{artist}} - {{title}}\t{{mpris:artUrl}}')
}

monitor &
monitor_pid=$!

spotify $@

# Kill the entire process group for the monitor job (playerctl + the read loop),
# not just monitor_pid, so playerctl doesn't survive as an orphan after Spotify quits.
kill -- -"$monitor_pid" 2>/dev/null || true
wait "$monitor_pid" 2>/dev/null || true

It basically starts Spotify with a playerctl instance which continuously reads for track changes within Spotify. Whenever one is registered, the track’s art is extracted to /tmp/spotify-song-art.jpg and a notification is displayed with said art.

The .desktop file

So that this script runs whenever and wherever Spotify is called, we must create a .desktop file that overrides the original. You can edit the original spotify.desktop file and redirect it to the workaround script or, even better, create a new entry under $HOME/.local/share/applications/spotify.desktop; here’s mine:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[Desktop Entry]
Type=Application
Name=Spotify
GenericName=Music Player
Icon=spotify-client
TryExec=spotify
Exec=spotify-notify --uri=%u
Terminal=false
MimeType=x-scheme-handler/spotify;
Categories=Audio;Music;Player;AudioVideo;
StartupWMClass=spotify

All I really did was change the Exec entry from spotify to spotify-notify, which itself launches Spotify. You might also want to consider creating an alias for your shell that does a similar mapping if you often launch Spotify from your terminal.