DankMaterialShell (Quickshell)
A Quickshell built shell designed to be highly functional, in Material 3 style.
Specifically created for niri.
Installation
- Install required dependencies
This shell was primarily built for niri, but only for workspaces and the active window widget in TopBar. So it could be used on any other wayland compositor with minimal changes.
# 1 --- Material Symbols Font (if not present)
mkdir -p ~/.local/share/fonts && curl -L "https://github.com/google/material-design-icons/raw/master/variablefont/MaterialSymbolsRounded%5BFILL%2CGRAD%2Copsz%2Cwght%5D.ttf" -o ~/.local/share/fonts/MaterialSymbolsRounded.ttf && fc-cache -f
# Arch: paru -S ttf-material-symbols-variable-git
# Fedora: Use manual installation (Fedora packages contain legacy Material Icons, not Material Symbols)
# 2 --- Inter Variable (recommended font)
mkdir -p ~/.local/share/fonts && curl -L "https://github.com/rsms/inter/releases/download/v4.0/Inter-4.0.zip" -o /tmp/Inter.zip && unzip -j /tmp/Inter.zip "InterVariable.ttf" "InterVariable-Italic.ttf" -d ~/.local/share/fonts/ && rm /tmp/Inter.zip && fc-cache -f
# Arch: pacman -S inter-font
# Fedora: sudo dnf install rsms-inter-fonts
# 3 --- Fira Code (recommended monospace font)
mkdir -p ~/.local/share/fonts && curl -L "https://github.com/tonsky/FiraCode/releases/download/6.2/Fira_Code_v6.2.zip" -o /tmp/FiraCode.zip && unzip -j /tmp/FiraCode.zip "ttf/*.ttf" -d ~/.local/share/fonts/ && rm /tmp/FiraCode.zip && fc-cache -f
# Arch: pacman -S ttf-fira-code
# Fedora: sudo dnf install fira-code-fonts
# 4 --- QuickShell (recommended to use a git build)
# Arch
paru -S quickshell-git
# Fedora
sudo dnf copr enable errornointernet/quickshell
sudo dnf install quickshell
# or
sudo dnf install quickshell-git
- Install optional dependencies to unlock certain features
| Dependency | Purpose | If Missing |
|---|---|---|
| matugen | Allows dynamic themes based on wallpaper and system app theming | Just can choose from preconfigured themes instead of dynamic colors |
| ddcutil | Allows controlling brightness of external monitors via DDC/CI | No external monitor brightness control |
| brightnessctl | Allows controlling brightness of laptop displays via backlight | No laptop display brightness control |
| wl-clipboard | Unlocks copy functionality of certain elements, such as process PIDs | No copy |
| qt5ct + qt6ct | Icon theme and Qt app theming | Setting icon theme in settings won't work for QT5 or QT6 applications, no Qt theming |
| adw-gtk3 | GTK app theming | No GTK theming |
| gsettings | GTK theme management | No GTK theming |
# Arch
# Core dependencies
pacman -S inter-font ttf-fira-code cava wl-clipboard cliphist
paru -S ttf-material-symbols-variable-git # AUR package
# Optional: Brightness control
pacman -S ddcutil # For external monitors
pacman -S brightnessctl # For laptop displays
# Optional: App theming (only if you use GTK/Qt applications)
pacman -S adw-gtk3 qt5ct qt6ct gsettings-desktop-schemas
# Third-party packages (AUR)
paru -S matugen
# Fedora
# Core dependencies
sudo dnf install cava wl-clipboard
# COPR packages (core dependencies from third-party repositories)
sudo dnf copr enable wef/cliphist && sudo dnf install cliphist
# Optional: Brightness control
sudo dnf install ddcutil # For external monitors
sudo dnf install brightnessctl # For laptop displays
# Optional: App theming (only if you use GTK/Qt applications)
sudo dnf install adw-gtk3-theme qt5ct qt6ct gsettings-desktop-schemas
# Optional third-party packages (COPR repositories)
sudo dnf copr enable heus-sueh/packages && sudo dnf install matugen
Note on networking: This shell requires NetworkManager for WiFi functionality.
Note on system app theming: DankMaterialShell can automatically theme GTK and Qt applications to match your dynamic wallpaper colors. This requires:
- For GTK apps:
adw-gtk3theme andgsettings - For Qt apps:
qt5ctand/orqt6ct
Enable these features in Settings → Appearance → System App Theming after installing the dependencies.
- Install DankMaterialShell
mkdir -p ~/.config/quickshell
git clone https://github.com/bbedward/DankMaterialShell.git ~/.config/quickshell/DankMaterialShell
- Enable
qs -c DankMaterialShell
# In niri config
spawn-at-startup "qs" "-c" "DankMaterialShell"
# Optionally at bindings for spotlight launcher and clipboard history
Mod+Space hotkey-overlay-title="Run an Application: Spotlight" { spawn "qs" "-c" "DankMaterialShell" "ipc" "call" "spotlight" "toggle"; }
Mod+V hotkey-overlay-title="Open Clipboard History" { spawn "qs" "-c" "DankMaterialShell" "ipc" "call" "clipboard" "toggle"; }
Available IPC Events
IPC Events are events that can be triggered with qs cli.
qs -c DankMaterialShell ipc call <target> <function>
System Controls
| Target | Function | Parameters | Description |
|---|---|---|---|
| audio | setvolume | percentage (string) | Set audio volume to specific percentage (0-100) |
| audio | increment | step (string, default: "5") | Increase volume by step percentage |
| audio | decrement | step (string, default: "5") | Decrease volume by step percentage |
| audio | mute | none | Toggle audio mute |
| audio | setmic | percentage (string) | Set microphone volume to specific percentage |
| audio | micmute | none | Toggle microphone mute |
| audio | status | none | Get current audio status (output/input levels and mute states) |
Application Controls
| Target | Function | Parameters | Description |
|---|---|---|---|
| spotlight | open | none | Open spotlight (app launcher) |
| spotlight | close | none | Close spotlight (app launcher) |
| spotlight | toggle | none | Toggle spotlight (app launcher) |
| clipboard | open | none | Open clipboard history view |
| clipboard | close | none | Close clipboard history view |
| clipboard | toggle | none | Toggle clipboard history view |
| processlist | open | none | Open process list (task manager) |
| processlist | close | none | Close process list (task manager) |
| processlist | toggle | none | Toggle process list (task manager) |
| lock | lock | none | Activate lockscreen |
| lock | demo | none | Show lockscreen in demo mode |
| lock | isLocked | none | Returns whether screen is currently locked |
Media Controls
| Target | Function | Parameters | Description |
|---|---|---|---|
| mpris | list | none | Get list of available media players |
| mpris | play | none | Start media playback on active player |
| mpris | pause | none | Pause media playback on active player |
| mpris | playPause | none | Toggle play/pause state on active player |
| mpris | previous | none | Skip to previous track on active player |
| mpris | next | none | Skip to next track on active player |
| mpris | stop | none | Stop media playback on active player |
System Services
| Target | Function | Parameters | Description |
|---|---|---|---|
| wallpaper | get | none | Get current wallpaper path |
| wallpaper | set | path (string) | Set wallpaper to image path and refresh theme |
| wallpaper | clear | none | Clear current wallpaper |
| theme | get | none | Get current theme mode (light/dark) |
| theme | toggle | none | Toggle between light and dark mode |
| theme | light | none | Set theme to light mode |
| theme | dark | none | Set theme to dark mode |
| notifs | clear | none | Clear all notifications |
(Optional) Setup Calendar events (Google, Microsoft, other Caldev, etc.)
- Install khal, vdirsyncer, and
aiohttp-oauthlib
# Arch
pacman -S vdirsyncer khal python-aiohttp-oauthlib
# Fedora
sudo dnf install python3-vdirsyncer khal python3-aiohttp-oauthlib
- Configure vdirsyncer
Follow the documentation, you will have different steps depending on which calendars you want to sync with.
mkdir -p ~/.vdirsyncer
# Create ~/.vdirsyncer/config (a single google calendar would look like)
[general]
status_path = "~/.calendars/status"
[pair personal_sync]
a = "personal"
b = "personallocal"
collections = ["from a", "from b"]
conflict_resolution = "a wins"
metadata = ["color"]
[storage personal]
type = "google_calendar"
token_file = "~/.vdirsyncer/google_calendar_token"
client_id = "...."
client_secret = "...."
[storage personallocal]
type = "filesystem"
path = "~/.calendars/Personal"
fileext = ".ics"
# Sync
vdirsyncer sync
# Create crontab
crontab -e
# e.g., this syncs every 5 minutes
*/5 * * * * /usr/bin/vdirsyncer sync
- Configure khal
# Run this
khal configure
# Choose option 2 for month/day/year
# Time format, doesnt matter
# Choose option 1 for use calendar already on this computer