out.mp4
All Fedora builds for caelestia-shell and its dependencies are available in the Nexus COPR repository:
sudo dnf copr enable ackerman/nexus
sudo dnf install caelestia-shell-mango caelestia-cli-mangocaelestia-cli-mango — the MangoWM fork of the caelestia CLI that drives colour schemes and wallpapers (required for caelestia scheme set, caelestia wallpaper).
| Dependency | Needed for |
|---|---|
cmake (≥ 3.19), ninja-build |
build system |
gcc-c++ or clang |
C++20 compiler |
pkgconf-pkg-config |
dependency detection |
Qt6 qtbase-devel + qtdeclarative-devel |
Qt6 core, gui, qml, quick, network, dbus, sql, concurrent |
qt6-qtwayland-devel |
Wayland integration |
qt6-qtshadertools-devel |
shader compilation |
libglvnd-devel |
OpenGL loader |
wayland-devel |
Wayland protocols |
libqalculate-devel |
in-app calculator |
pipewire-devel |
audio control |
aubio-devel |
audio beat detection |
libcava-devel |
audio visualiser |
fftw-devel |
FFT (cava dependency) |
material-symbols-fonts |
icon set |
cascadia-code-nerd-fonts |
monospace font |
Install the development packages for each dependency via your distro's package manager.
| Package | Notes |
|---|---|
quickshell-git |
must be git version, not latest tagged |
mangowm |
with mmsg IPC support |
libpipewire |
audio control |
networkmanager |
network info |
lm-sensors |
hardware monitoring |
libcava |
audio visualiser |
grim |
active-window preview (grim -T <foreign_toplevel_id>) |
swappy |
screenshot editor |
wl-clipboard |
clipboard access (wl-copy, wl-paste) |
cliphist |
clipboard history (powered by wl-clipboard) |
caelestia-cli-mango |
colour scheme & wallpaper management (caelestia scheme set, caelestia wallpaper). MangoWM fork of caelestia-dots/cli (no Hyprland coupling); available as the caelestia-cli-mango COPR package or via pip install --user -e <repo>. Generates colors from wallpapers via materialyoucolor (not matugen). |
libnotify |
desktop notifications (notify-send) |
procps |
process monitoring (pidof) |
util-linux |
disk info (lsblk) |
libxml2 |
XKB layout parsing (xmllint) |
fprintd |
fingerprint authentication |
app2unit |
application launcher (converts desktop entries to systemd units) |
systemd |
session management (loginctl, systemctl) |
polkit |
privilege escalation (pkexec) |
iproute2 |
VPN/wireguard status (ip link show) |
bash |
used throughout for shell commands |
Note: Keyboard layout switching uses
setxkbmap(tool-agnostic). No Hyprland dependencies remain.
| Package | Notes |
|---|---|
libqalculate |
in-app calculator |
aubio |
audio beat detection |
ddcutil |
external monitor control |
gpu-screen-recorder |
screen recording (monitored via pidof) |
brightnessctl |
backlight control (needed if not using ddcutil) |
asdbctl |
ASUS external display backlight control (only if ASUS) |
nvidia-smi / glxinfo / lspci |
GPU name detection (fallback chain) |
tailscale / netbird / warp-cli |
VPN provider status in the network pane (only if used) |
fish |
calculator integration shell |
Builds the C++ QML plugin and installs everything system-wide.
git clone https://github.com/Ackerman-00/caelestia-shell-mango
cd caelestia-shell-mango
cmake -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/ \
-DENABLE_MODULES="extras;plugin;shell" \
-DINSTALL_LIBDIR=/usr/lib64/caelestia \
-DINSTALL_QMLDIR=/usr/lib64/qt6/qml \
-DINSTALL_QSCONFDIR=/usr/share/caelestia-shell
cmake --build build
sudo cmake --install buildThen create the caelestia-shell wrapper used by IPC calls, keybinds and autostart
(the Fedora package installs the same wrapper automatically):
sudo tee /usr/bin/caelestia-shell > /dev/null << 'EOF'
#!/bin/bash
export CAELESTIA_LIB_DIR="/usr/lib64/caelestia"
exec /usr/bin/qs -p "/usr/share/caelestia-shell" "$@"
EOF
sudo chmod +x /usr/bin/caelestia-shellAdjust INSTALL_LIBDIR/INSTALL_QMLDIR/INSTALL_QSCONFDIR for your distro
(Fedora uses /usr/lib64; Debian/Arch typically /usr/lib) and mirror the paths
inside the wrapper script above.
git clone https://github.com/Ackerman-00/caelestia-shell-mango
cd caelestia-shell-mango
nix build .#caelestia-shellThe built binary is at result/bin/caelestia-shell. Run directly:
./result/bin/caelestia-shell -dnix profile install .#caelestia-shellThis installs caelestia-shell to ~/.nix-profile/bin/, placing it in your PATH on NixOS. Verify with which caelestia-shell.
env.conf: After nix profile install, ensure
~/.nix-profile/binis in MangoWM's PATH (see env.conf below).
Need MangoWM's dotfiles/keybinds? The full compositor configuration (keybinds, rules, monitor setup,
mango_core.conf) lives in mango-config — head over there.
NixOS only. MangoWM already has standard system paths in its default PATH. Only needed to add nix-specific paths:
env=PATH,/home/<username>/.nix-profile/bin:/run/current-system/sw/bin:~/.local/bin:/usr/bin:/bin
Caelestia sets
XDG_CURRENT_DESKTOP,XDG_SESSION_DESKTOP,SDL_VIDEODRIVER, andXDG_DESKTOP_PORTALat startup — no need to put those in env.conf.
Add to ~/.config/mango/config.conf:
exec-once = caelestia-shell -d
Add to ~/.config/mango/rule.conf to disable blur on shell surfaces:
noblur:1 caelestia
Add to ~/.config/mango/mango_bind.conf:
# ─── CAELESTIA SHELL IPC ───────────────────────────────────
bind=SUPER,a,spawn_shell,caelestia-shell ipc call drawers toggle launcher
bind=SUPER,v,spawn_shell,caelestia-shell ipc call clipboard open
bind=SUPER,comma,spawn_shell,caelestia-shell ipc call controlCenter open
bind=SUPER,w,spawn_shell,caelestia-shell ipc call wallpaper openMenu
bind=CTRL+ALT,w,spawn_shell,caelestia-shell ipc call wallpaper random
bind=SUPER+p,spawn_shell,caelestia-shell ipc call drawers toggle dashboard
bind=SUPER+l,spawn_shell,caelestia-shell ipc call lock lock
bind=SUPER+SHIFT,Print,spawn_shell,caelestia-shell ipc call picker open
bind=CTRL+ALT,U,spawn_shell,caelestia-shell ipc call record start
bind=CTRL+ALT,P,spawn_shell,caelestia-shell ipc call record togglePause
bind=CTRL+ALT,S,spawn_shell,caelestia-shell ipc call record stop
bind=CTRL+ALT,Delete,spawn_shell,caelestia-shell ipc call drawers toggle session
bind=NONE,XF86AudioRaiseVolume,spawn_shell,caelestia-shell ipc call audio set 5%+
bind=NONE,XF86AudioLowerVolume,spawn_shell,caelestia-shell ipc call audio set 5%-
bind=NONE,XF86AudioMute,spawn_shell,caelestia-shell ipc call audio mute
spawn_shellroutes through/bin/sh -c, ensuring shell pipelines and argument handling work correctly.caelestia-shellis resolved viaenv.confPATH.
All IPC commands go through caelestia-shell (in PATH after system-wide install):
caelestia-shell ipc call <target> <function> [args...]When running the dev shell from the repo (quickshell -p /path/to/repo), target the
running instance's shell dir instead:
quickshell ipc -p /path/to/repo call <target> <function> [args...]Toggle launcher, dashboard, sidebar, utilities, session, and OSD panels.
| Function | Signature | Description |
|---|---|---|
toggle |
toggle(drawer: string) |
Toggle a drawer (launcher, dashboard, utilities, sidebar, session, osd) |
list |
list(): string |
List available drawer names |
isOpen |
isOpen(drawer: string): string |
Check if a drawer is open ("1" / "0" / "unknown") |
Open the launcher directly into clipboard history mode.
| Function | Signature | Description |
|---|---|---|
open |
open(): void |
Open launcher with clipboard history |
Open the settings/control center window.
| Function | Signature | Description |
|---|---|---|
open |
open(): void |
Open control center |
openPane |
openPane(pane: string): void |
Open control center on a specific pane (appearance, audio, bluetooth, dashboard, launcher, network, notifications, session, taskbar) |
Manage wallpapers. All functions use the configured paths.wallpaperDir
(see Paths) — no hardcoded directory. The folder can also be picked
manually from Settings → Appearance → Background → Wallpaper folder (writes the
same paths.wallpaperDir config key).
| Function | Signature | Description |
|---|---|---|
get |
get(): string |
Get current wallpaper path |
set |
set(path: string): void |
Set wallpaper by path |
random |
random(): void |
Set a random wallpaper from the configured wallpaper directory (runs caelestia wallpaper -r <wallsdir>) |
list |
list(): string |
List all available wallpaper paths |
openMenu |
openMenu(): void |
Open launcher with wallpaper picker |
Notification controls.
| Function | Signature | Description |
|---|---|---|
clear |
clear(): void |
Clear all notifications |
toggleDnd |
toggleDnd(): void |
Toggle Do Not Disturb |
enableDnd |
enableDnd(): void |
Enable Do Not Disturb |
disableDnd |
disableDnd(): void |
Disable Do Not Disturb |
isDndEnabled |
isDndEnabled(): bool |
Check DND status |
Media player control.
| Function | Signature | Description |
|---|---|---|
play |
play(): void |
Play |
pause |
pause(): void |
Pause |
playPause |
playPause(): void |
Toggle play/pause |
next |
next(): void |
Next track |
previous |
previous(): void |
Previous track |
stop |
stop(): void |
Stop |
list |
list(): string |
List available players |
getActive |
getActive(prop: string): string |
Get property from active player ("trackTitle", "identity", etc.) |
Audio device control.
| Function | Signature | Description |
|---|---|---|
get |
get(): real |
Get current volume (0–1) |
set |
set(value: string): string |
Set volume (0.5, +0.05, 5%+, 5%-, +10%, 10%-) |
mute |
mute(): void |
Toggle mute |
cycleOutput |
cycleOutput(): void |
Cycle to next audio output sink |
Monitor brightness control.
| Function | Signature | Description |
|---|---|---|
get |
get(): real |
Get active monitor brightness |
getFor |
getFor(query: string): real |
Get brightness for specific monitor |
set |
set(value: string): string |
Set brightness (0.5, +10%, 10%-) |
setFor |
setFor(query: string, value: string): string |
Set brightness for specific monitor |
Session lock.
| Function | Signature | Description |
|---|---|---|
lock |
lock(): void |
Lock session |
unlock |
unlock(): void |
Unlock session |
isLocked |
isLocked(): bool |
Check if locked |
Area screenshot picker.
| Function | Signature | Description |
|---|---|---|
open |
open(): void |
Open picker |
openFreeze |
openFreeze(): void |
Open with frozen screen |
openClip |
openClip(): void |
Open and copy to clipboard |
openFreezeClip |
openFreezeClip(): void |
Open with freeze + clipboard |
Send toast notifications.
| Function | Signature | Description |
|---|---|---|
info |
info(title, message, icon) |
Info toast |
success |
success(title, message, icon) |
Success toast |
warn |
warn(title, message, icon) |
Warning toast |
error |
error(title, message, icon) |
Error toast |
Toggle game mode (disables animations, blur, shadows, gaps, border rounding; forces
allow_tearing). On Mango this writes ~/.config/mango/caelestia_gamemode.conf and toggles a
source= line in mango_core.conf + mmsg dispatch reload_config — removing the source line
restores the user's original values, and the state survives shell restarts.
| Function | Signature | Description |
|---|---|---|
toggle |
toggle(): void |
Toggle game mode |
enable |
enable(): void |
Enable game mode |
disable |
disable(): void |
Disable game mode |
isEnabled |
isEnabled(): bool |
Check game mode status |
Inhibit idle/screensaver.
| Function | Signature | Description |
|---|---|---|
toggle |
toggle(): void |
Toggle idle inhibit |
enable |
enable(): void |
Enable idle inhibit |
disable |
disable(): void |
Disable idle inhibit |
isEnabled |
isEnabled(): bool |
Check inhibit status |
Screen recording (drives gpu-screen-recorder via the caelestia CLI).
| Function | Signature | Description |
|---|---|---|
start |
start(): void |
Start recording on the focused monitor |
startArgs |
startArgs(extraArgs: string): void |
Start recording with whitespace-separated extra args (e.g. "-r" for region via slurp, "-s" for sound) |
stop |
stop(): void |
Stop recording |
togglePause |
togglePause(): void |
Pause/resume recording |
isRunning |
isRunning(): string |
Check if recording ("1" / "0") |
isPaused |
isPaused(): string |
Check if paused ("1" / "0") |
MangoWC compositor bridge.
| Function | Signature | Description |
|---|---|---|
refreshDevices |
refreshDevices(): void |
Refresh input devices |
Edit ~/.config/caelestia/shell.json (must be created manually).
| Key | Default | Description |
|---|---|---|
paths.wallpaperDir |
~/Pictures/Wallpapers |
Wallpaper directory (source of truth for wallpaper list/random/set; can be set from Settings → Appearance → Background → Wallpaper folder) |
paths.lyricsDir |
~/Music/lyrics/ |
MPRIS lyrics directory |
paths.sessionGif |
root:/assets/kurukuru.gif |
Session menu animation |
paths.mediaGif |
root:/assets/bongocat.gif |
Media player animation |
Profile picture for the dashboard is read from ~/.face.
cd caelestia-shell-mango
git pull
cmake --build build
sudo cmake --install buildcd caelestia-shell-mango
git pull
nix profile upgrade caelestia-shellOr rebuild and reinstall:
nix build .#caelestia-shell && nix profile install .#caelestia-shellRestart Quickshell after updating: pkill quickshell && caelestia-shell -d.