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.