SwayNotificationCenter
A simple GTK based notification daemon for any Wayland compositor
Install / Use
/learn @ErikReider/SwayNotificationCenterREADME
SwayNotificationCenter
A simple notification daemon with a GTK gui for notifications and the control center
Note: SwayNotificationCenter only supports Desktops / Window Managers that
support wlr_layer_shell_unstable_v1 like Sway or anything wlroots based
Note 2: SwayNotificationCenter does not support third-party GTK3 themes and is only tested with the default GTK Adwaita theme. Usage of any third-party theme might require extra tweaks to the default CSS style file
Demo
https://github.com/user-attachments/assets/5c054ac3-90bb-483e-a8f2-5af191805f04
Table of Contents
- Want to show off your sick config?
- Features
- Available Widgets
- Planned Features
- Install
- Sway Usage
- Run
- Control Center Shortcuts
- Configuring
- Notification Inhibition
- Scripting
- i3status-rs Example
- Waybar Example
- Debugging Environment Variables
Want to show off your sick config?
Post your setup here: Config flex 💪
<p> <img height="500" alt="Config" src="https://github.com/user-attachments/assets/5993cbb2-a54d-4d1c-9289-b7e2b9d0a09f" /> </p> <p> <em> Example of my config (<a href="https://github.com/ErikReider/Linux/tree/master/dotfiles/.config/swaync">link</a>) </em> </p>Features
- Grouped notifications
- Keyboard shortcuts
- Notification body markup with image support
- Inline replies
- A panel to view previous notifications
- Show album art for notifications like Spotify
- Do not disturb
- Notification action filtering
- Inhibiting notifications through DBUS or client
- Restores previous Do not disturb value after restart
- Click notification to execute default action
- Show alternative notification actions
- Copy detected 2FA codes to clipboard
- Customization through a CSS file
- Trackpad/mouse gesture to close notification
- The same features as any other basic notification daemon
- Basic configuration through a JSON config file
- Hot-reload config through
swaync-client - Customizable widgets
- Select the preferred monitor to display on (with swaync-client command for scripting)
Available Widgets
These widgets can be customized, added, removed and even reordered
- Title
- Do Not Disturb
- Notifications (Will always be visible)
- Label
- Mpris (Media player controls for Spotify, Firefox, Chrome, etc...)
- Menubar with dropdown and buttons
- Button grid
- Volume slider using PulseAudio
- Backlight slider
Planned Features
- Slick animations 😎
Install
Alpine Linux
apk add swaync
Arch
sudo pacman -S swaync
Alternatively, swaync-git is available on the AUR.
Fedora
The package is available on COPR:
dnf copr enable erikreider/SwayNotificationCenter
# Or latest stable release or -git package
dnf install SwayNotificationCenter
dnf install SwayNotificationCenter-git
Fedora Silverblue (and other rpm-ostree variants)
The package can be layered over the base image after adding the Copr repo as an ostree repo:
sudo curl -sL -o /etc/yum.repos.d/_copr:copr.fedorainfracloud.org:erikreider:SwayNotificationCenter.repo https://copr.fedorainfracloud.org/coprs/erikreider/SwayNotificationCenter/repo/fedora-$(rpm -E %fedora)/erikreider-SwayNotificationCenter-fedora-$(rpm -E %fedora).repo
rpm-ostree install SwayNotificationCenter
Gentoo
An unofficial ebuild is available in GURU
eselect repository enable guru
emaint sync --repo guru
emerge --ask gui-apps/swaync
OpenSUSE Tumbleweed
sudo zypper install SwayNotificationCenter
Ubuntu
Lunar and later:
sudo apt install sway-notification-center
Debian
Bookworm and later:
sudo apt install sway-notification-center
Guix
The simplest way is to install it to user's profile:
guix install swaynotificationcenter
But we recommend to use Guix Home to manage packages and their configurations declaratively.
rde
(use-modules (rde features wm))
;; Include the following code into the list of your rde features:
(feature-swaynotificationcenter)
Void
sudo xbps-install -S SwayNotificationCenter
Other
Dependencies
vala >= 0.56mesonblueprint-compilergitscdocsasscgtk4gtk4-layer-shelldbusglib2gobject-introspectionlibgeejson-gliblibadwaitagvfsgranite7
Optional Dependencies
libpulse(requires meson build options change)libnotify
meson setup build --prefix=/usr
meson compile -C build
meson install -C build
Development
Setup and build
meson setup build
meson compile -C build
Set the environment
# Sets the correct environment variables
meson devenv -C build -w .
# Now you can start nvim, vscode, etc in the development environment
Sway Usage
# Notification Daemon
exec swaync
# Toggle control center
bindsym $mod+Shift+n exec swaync-client -t -sw
Run
To start the daemon (remember to kill any other notification daemon before running)
./build/src/swaync
To toggle the panel
./build/src/swaync-client -t
To reload the config
./build/src/swaync-client -R
To reload css after changes
./build/src/swaync-client -rs
Control Center Shortcuts
- Up/Down: Navigate notifications
- Home: Navigate to the latest notification
- End: Navigate to the oldest notification
- Escape/Caps_Lock: Close notification panel
- Return: Execute default action or close notification if none
- Delete/BackSpace: Close notification
- Shift+C: Close all notifications
- Shift+D: Toggle Do Not Disturb
- Buttons 1-9: Execute alternative actions
- Left click button / actions: Activate notification action
- Middle/Right click notification: Close notification
Configuring
The main config file is located in /etc/xdg/swaync/config.json. Copy it over
to your .config/swaync/ folder to customize without needing root access.
See swaync(5) man page for more information
To reload the config, you'll need to run swaync-client --reload-config
The main CSS style file is located in /etc/xdg/swaync/style.css. Copy it over
to your ~/.config/swaync/ folder to customize without needing root access. For
more advanced/larger themes, I recommend that you use the SCSS files from source
and customize them instead. To use the SCSS files, compile with sassc.
Tip: running swaync with GTK_DEBUG=interactive swaync will open a inspector
window that'll allow you to see all of the CSS classes + other information.
Toggle Buttons
To add toggle buttons to your control center you can set the "type" of any action to "toggle". The toggle button supports different commands depending on the state of the button and an "update-command" to update the state in case of changes from outside swaync. The update-command is called every time the control center is opened. The active toggle button also gains the css-class ".toggle:checked"
config.json example:
{
"buttons-grid": { // also works with actions in menubar widget
"actions": [
{
"label": "WiFi",
"type": "toggle",
"active": true,
"command": "sh -c '[[ $SWAYNC_TOGGLE_STATE == true ]] && nmcli radio wifi on || nmcli radio wifi off'",
"update-command": "sh -c '[[ $(nmcli radio wifi) == \"enabled\" ]] && echo true || echo false'"
}
]
}
}
Notification Inhibition
Notifications can be inhibited through the provided swaync-client executable
or through the DBus interface org.erikreider.swaync.cc.
Here's an example of notification inhibition while screen sharing through
xdg-desktop-portal-wlr
# xdg-desktop-portal-wlr config
[screencast]
exec_before=swaync-client --inhibitor-add "xdg-desktop-portal-wlr"
exec_after=swaync-client --inhibitor-remove "xdg-desktop-portal-wlr"
Scripting
Scripting rules and logic:
. <b>Only one</b> script can be fired per notification
. Each script requires exec and at least one of the other properties
. All listed properties must match the notification for the script to be ran
.
Related Skills
node-connect
335.9kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
82.7kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
335.9kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
82.7kCommit, push, and open a PR
