A Quickshell-based desktop environment forked from Caelestia Shell, adapted to run with the Niri window manager. This fork keeps the dashboard-based workflow while experimenting with new sidebar features and Niri.
[!CAUTION] This fork is outdated and abandoned, it does work but isn't up-to-date. Please check out other forks!
This repo is ONLY for the desktop shell of the caelestia dots. For the default caelestia dots, head to the main repo instead.
[!WARNING] HELP REQUIRED!
I skipped unneccesary commit from original shell named: "bar/workspaces: add special ws overlay" and "bar/workspaces: better scroll" because there is no special workspace in Niri.
Unfortunately, I skipped an important commit from original shell named: "bar: per-monitor workspaces option (#394)"
- Reason: I don't have multi monitor so I'm not sure if this actually works, I might break stuff :/. I need help implementing that feature :)
Replaces Hyprland with Niri as the window manager.
DashboardWindow switch popup
Experimental Niri management tab in dashboard
SidebarMisc[!NOTE] Some Caelestia features are dropped or WIP due to Niri limitations. See known issues
You need both runtime dependencies and development headers.
quickshell-git networkmanager fish glibc qt6-declarative gcc-libs cava libcava aubio libpipewire lm-sensors ddcutil brightnessctl material-symbols caskaydia-cove-nerd grim swappy app2unit libqalculate[!NOTE]
Unlike the default shell,
caelestia-cliis not required for Niri.
| Package | Usage |
|---|---|
quickshell-git | Must be the git version |
networkmanager | Network management |
fish | Terminal |
glibc | C library (runtime dependency) |
qt6-declarative | Qt components |
gcc-libs | GCC runtime |
| Package | Usage |
|---|---|
cava | Audio visualizer |
libcava | Visualizer backend |
aubio | Beat detector |
libpipewire | Media backend |
lm-sensors | System usage monitoring |
ddcutil | Monitor brightness control |
brightnessctl | Brightness control |
| Package | Usage |
|---|---|
material-symbols | Icon font |
caskaydia-cove-nerd | Monospace font |
| Package | Usage |
|---|---|
grim | Screenshot tool |
swappy | Screenshot annotation |
app2unit | Launch apps |
libqalculate | Calculator |
To install the shell manually, install all dependencies and clone this repo to $XDG_CONFIG_HOME/quickshell/niri-caelestia-shell.
Then simply build and install using cmake.
[!NOTE] There is NO package manager installation support yet because... ๐ค
Install dependencies.
Clone the repo:
cd $XDG_CONFIG_HOME/quickshell
git clone https://github.com/jutraim/niri-caelestia-shell
Build:
cd $XDG_CONFIG_HOME/quickshell/niri-caelestia-shell
cmake -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=$HOME \
-DINSTALL_QSCONFDIR=$HOME/.config/quickshell/niri-caelestia-shell
cmake --build build
cmake --install build
It's trying to install into system paths (/usr/lib/caelestia/...),
so grab the necessary permissions or use sudo while installing.
If you get VERSION is not set and failed to get from git error, that means I forgot to tag version. You can do git tag 1.1.1 to work around it :)
You can update by running git pull in $XDG_CONFIG_HOME/quickshell/niri-caelestia-shell.
cd $XDG_CONFIG_HOME/quickshell/niri-caelestia-shell
git pull
The shell can be started via the quickshell -c niri-caelestia-shell -n command or qs -c niri-caelestia-shell -n on your preferred terminal.
(
qsandquickshellare interchangable.)
Example line for niri config.kdl to launch the shell at startup:
spawn-at-startup "quickshell" "-c" "niri-caelestia-shell" "-n"
All keybinds are accessible via Quickshell IPC msg.
All IPC commands can be called via quickshell -c niri-caelestia-shell ipc call ...
For example:
qs -c niri-caelestia-shell ipc call mpris getActive <trackTitle>
Example shortcut in config.kdl to toggle the launcher drawer:
Mod+Space { spawn "qs" "-c" "niri-caelestia-shell" "ipc" "call" "drawers" "toggle" "launcher"; }
Mod+Space hotkey-overlay-title="Caelestia app launcher" { spawn-sh "qs -c niri-caelestia-shell ipc call drawers toggle launcher"; }
The list of IPC commands can be shown via qs -c shell ipc show.
โฏ qs -c shell ipc show
target picker
function openFreeze(): void
function open(): void
target drawers
function list(): string
function toggle(drawer: string): void
target lock
function unlock(): void
function isLocked(): bool
function lock(): void
target wallpaper
function get(): string
function set(path: string): void
function list(): string
target notifs
function clear(): void
target mpris
function next(): void
function previous(): void
function getActive(prop: string): string
function playPause(): void
function pause(): void
function stop(): void
function list(): string
function play(): void
Config lives in:
~/.config/caelestia/shell.json
{
"appearance": {
"anim": {
"durations": {
"scale": 1
}
},
"font": {
"family": {
"material": "Material Symbols Rounded",
"mono": "CaskaydiaCove NF",
"sans": "Rubik"
},
"size": {
"scale": 1
}
},
"padding": {
"scale": 1
},
"rounding": {
"scale": 1
},
"spacing": {
"scale": 1
},
"transparency": {
"enabled": false,
"base": 0.85,
"layers": 0.4
}
},
"general": {
"apps": {
"terminal": [
"foot"
],
"audio": [
"pavucontrol"
]
}
},
"background": {
"desktopClock": {
"enabled": false
},
"enabled": true,
"visualiser": {
"enabled": true,
"autoHide": true,
"rounding": 1,
"spacing": 1
}
},
"bar": {
"clock": {
"showIcon": false
},
"dragThreshold": 20,
"entries": [
{
"id": "logo",
"enabled": true
},
{
"id": "workspaces",
"enabled": true
},
{
"id": "spacer",
"enabled": true
},
{
"id": "activeWindow",
"enabled": true
},
{
"id": "spacer",
"enabled": true
},
{
"id": "tray",
"enabled": true
},
{
"id": "clock",
"enabled": true
},
{
"id": "statusIcons",
"enabled": true
},
{
"id": "power",
"enabled": true
},
{
"id": "idleInhibitor",
"enabled": false
}
],
"persistent": false,
"showOnHover": true,
"status": {
"showAudio": false,
"showBattery": true,
"showBluetooth": true,
"showMicrophone": false,
"showKbLayout": false,
"showNetwork": true
},
"tray": {
"background": true,
"recolour": true
},
"workspaces": {
"activeIndicator": true,
"activeLabel": "๓ฐฎฏ",
"activeTrail": false,
"groupIconsByApp": true,
"groupingRespectsLayout": true,
"windowRighClickContext": true,
"label": "โฆ",
"occupiedBg": true,
"occupiedLabel": "โ",
"showWindows": true,
"shown": 4,
"windowIconImage": true,
"focusedWindowBlob": true,
"windowIconGap": 0,
"windowIconSize": 30
}
},
"border": {
"rounding": 25,
"thickness": 10
},
"dashboard": {
"mediaUpdateInterval": 500,
"showOnHover": true
},
"launcher": {
"actionPrefix": ">",
"dragThreshold": 50,
"vimKeybinds": false,
"enableDangerousActions": false,
"maxShown": 8,
"maxWallpapers": 9,
"specialPrefix": "@",
"useFuzzy": {
"apps": false,
"actions": false,
"schemes": false,
"variants": false,
"wallpapers": false
},
"showOnHover": false
},
"lock": {
"recolourLogo": false
},
"notifs": {
"actionOnClick": false,
"clearThreshold": 0.3,
"defaultExpireTimeout": 5000,
"expandThreshold": 20,
"expire": false
},
"osd": {
"enabled": true,
"enableBrightness": true,
"enableMicrophone": true,
"hideDelay": 2000
},
"paths": {
"mediaGif": "root:/assets/bongocat.gif",
"sessionGif": "root:/assets/kurukuru.gif",
"wallpaperDir": "~/Pictures/Wallpapers"
},
"services": {
"audioIncrement": 0.1,
"defaultPlayer": "Spotify",
"gpuType": "",
"playerAliases": [
{
"from": "com.github.th_ch.youtube_music",
"to": "YT Music"
}
],
"weatherLocation": "",
"useFahrenheit": false,
"useTwelveHourClock": false,
"smartScheme": true,
"visualiserBars": 45
},
"session": {
"dragThreshold": 30,
"vimKeybinds": false,
"commands": {
"logout": [
"loginctl",
"terminate-user",
""
],
"shutdown": [
"systemctl",
"poweroff"
],
"hibernate": [
"systemctl",
"hibernate"
],
"reboot": [
"systemctl",
"reboot"
]
}
}
}
I don't have nix, plz help :D
{
programs.niri-caelestia-shell = {
enable = true;
with-cli = true;
settings.theme.accent = "#ffb86c";
};
}
The profile picture for the dashboard is read from the file ~/.face, so to set
it you can copy your image to there or set it via the dashboard. It's not a directory.
The wallpapers for the wallpaper switcher are read from ~/Pictures/Wallpapers
by default. To change it, change the wallpapers path in ~/.config/caelestia/shell.json.
To set the wallpaper, you can use the app launcher command > wallpaper.
Q: Can I theme it?
A: Yes, via shell.json (or Nix options if you use Home Manager).
Q: Why does my task manager Intel GPU messed-up? A: GPU monitoring is limited; Intel isnโt supported yet.
Q: Why does it take so long for you to update? A: Civil unrest in my country ๐ฅ
(top 30 of 31)
QML
86.1%
JavaScript
6.3%
C++
6.1%
A Quickshell-based desktop environment forked from Caelestia Shell, adapted to run with the Niri window manager. This fork keeps the dashboard-based workflow while experimenting with new sidebar features and Niri.
[!CAUTION] This fork is outdated and abandoned, it does work but isn't up-to-date. Please check out other forks!
This repo is ONLY for the desktop shell of the caelestia dots. For the default caelestia dots, head to the main repo instead.
[!WARNING] HELP REQUIRED!
I skipped unneccesary commit from original shell named: "bar/workspaces: add special ws overlay" and "bar/workspaces: better scroll" because there is no special workspace in Niri.
Unfortunately, I skipped an important commit from original shell named: "bar: per-monitor workspaces option (#394)"
- Reason: I don't have multi monitor so I'm not sure if this actually works, I might break stuff :/. I need help implementing that feature :)
Replaces Hyprland with Niri as the window manager.
DashboardWindow switch popup
Experimental Niri management tab in dashboard
SidebarMisc[!NOTE] Some Caelestia features are dropped or WIP due to Niri limitations. See known issues
You need both runtime dependencies and development headers.
quickshell-git networkmanager fish glibc qt6-declarative gcc-libs cava libcava aubio libpipewire lm-sensors ddcutil brightnessctl material-symbols caskaydia-cove-nerd grim swappy app2unit libqalculate[!NOTE]
Unlike the default shell,
caelestia-cliis not required for Niri.
| Package | Usage |
|---|---|
quickshell-git | Must be the git version |
networkmanager | Network management |
fish | Terminal |
glibc | C library (runtime dependency) |
qt6-declarative | Qt components |
gcc-libs | GCC runtime |
| Package | Usage |
|---|---|
cava | Audio visualizer |
libcava | Visualizer backend |
aubio | Beat detector |
libpipewire | Media backend |
lm-sensors | System usage monitoring |
ddcutil | Monitor brightness control |
brightnessctl | Brightness control |
| Package | Usage |
|---|---|
material-symbols | Icon font |
caskaydia-cove-nerd | Monospace font |
| Package | Usage |
|---|---|
grim | Screenshot tool |
swappy | Screenshot annotation |
app2unit | Launch apps |
libqalculate | Calculator |
To install the shell manually, install all dependencies and clone this repo to $XDG_CONFIG_HOME/quickshell/niri-caelestia-shell.
Then simply build and install using cmake.
[!NOTE] There is NO package manager installation support yet because... ๐ค
Install dependencies.
Clone the repo:
cd $XDG_CONFIG_HOME/quickshell
git clone https://github.com/jutraim/niri-caelestia-shell
Build:
cd $XDG_CONFIG_HOME/quickshell/niri-caelestia-shell
cmake -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=$HOME \
-DINSTALL_QSCONFDIR=$HOME/.config/quickshell/niri-caelestia-shell
cmake --build build
cmake --install build
It's trying to install into system paths (/usr/lib/caelestia/...),
so grab the necessary permissions or use sudo while installing.
If you get VERSION is not set and failed to get from git error, that means I forgot to tag version. You can do git tag 1.1.1 to work around it :)
You can update by running git pull in $XDG_CONFIG_HOME/quickshell/niri-caelestia-shell.
cd $XDG_CONFIG_HOME/quickshell/niri-caelestia-shell
git pull
The shell can be started via the quickshell -c niri-caelestia-shell -n command or qs -c niri-caelestia-shell -n on your preferred terminal.
(
qsandquickshellare interchangable.)
Example line for niri config.kdl to launch the shell at startup:
spawn-at-startup "quickshell" "-c" "niri-caelestia-shell" "-n"
All keybinds are accessible via Quickshell IPC msg.
All IPC commands can be called via quickshell -c niri-caelestia-shell ipc call ...
For example:
qs -c niri-caelestia-shell ipc call mpris getActive <trackTitle>
Example shortcut in config.kdl to toggle the launcher drawer:
Mod+Space { spawn "qs" "-c" "niri-caelestia-shell" "ipc" "call" "drawers" "toggle" "launcher"; }
Mod+Space hotkey-overlay-title="Caelestia app launcher" { spawn-sh "qs -c niri-caelestia-shell ipc call drawers toggle launcher"; }
The list of IPC commands can be shown via qs -c shell ipc show.
โฏ qs -c shell ipc show
target picker
function openFreeze(): void
function open(): void
target drawers
function list(): string
function toggle(drawer: string): void
target lock
function unlock(): void
function isLocked(): bool
function lock(): void
target wallpaper
function get(): string
function set(path: string): void
function list(): string
target notifs
function clear(): void
target mpris
function next(): void
function previous(): void
function getActive(prop: string): string
function playPause(): void
function pause(): void
function stop(): void
function list(): string
function play(): void
Config lives in:
~/.config/caelestia/shell.json
{
"appearance": {
"anim": {
"durations": {
"scale": 1
}
},
"font": {
"family": {
"material": "Material Symbols Rounded",
"mono": "CaskaydiaCove NF",
"sans": "Rubik"
},
"size": {
"scale": 1
}
},
"padding": {
"scale": 1
},
"rounding": {
"scale": 1
},
"spacing": {
"scale": 1
},
"transparency": {
"enabled": false,
"base": 0.85,
"layers": 0.4
}
},
"general": {
"apps": {
"terminal": [
"foot"
],
"audio": [
"pavucontrol"
]
}
},
"background": {
"desktopClock": {
"enabled": false
},
"enabled": true,
"visualiser": {
"enabled": true,
"autoHide": true,
"rounding": 1,
"spacing": 1
}
},
"bar": {
"clock": {
"showIcon": false
},
"dragThreshold": 20,
"entries": [
{
"id": "logo",
"enabled": true
},
{
"id": "workspaces",
"enabled": true
},
{
"id": "spacer",
"enabled": true
},
{
"id": "activeWindow",
"enabled": true
},
{
"id": "spacer",
"enabled": true
},
{
"id": "tray",
"enabled": true
},
{
"id": "clock",
"enabled": true
},
{
"id": "statusIcons",
"enabled": true
},
{
"id": "power",
"enabled": true
},
{
"id": "idleInhibitor",
"enabled": false
}
],
"persistent": false,
"showOnHover": true,
"status": {
"showAudio": false,
"showBattery": true,
"showBluetooth": true,
"showMicrophone": false,
"showKbLayout": false,
"showNetwork": true
},
"tray": {
"background": true,
"recolour": true
},
"workspaces": {
"activeIndicator": true,
"activeLabel": "๓ฐฎฏ",
"activeTrail": false,
"groupIconsByApp": true,
"groupingRespectsLayout": true,
"windowRighClickContext": true,
"label": "โฆ",
"occupiedBg": true,
"occupiedLabel": "โ",
"showWindows": true,
"shown": 4,
"windowIconImage": true,
"focusedWindowBlob": true,
"windowIconGap": 0,
"windowIconSize": 30
}
},
"border": {
"rounding": 25,
"thickness": 10
},
"dashboard": {
"mediaUpdateInterval": 500,
"showOnHover": true
},
"launcher": {
"actionPrefix": ">",
"dragThreshold": 50,
"vimKeybinds": false,
"enableDangerousActions": false,
"maxShown": 8,
"maxWallpapers": 9,
"specialPrefix": "@",
"useFuzzy": {
"apps": false,
"actions": false,
"schemes": false,
"variants": false,
"wallpapers": false
},
"showOnHover": false
},
"lock": {
"recolourLogo": false
},
"notifs": {
"actionOnClick": false,
"clearThreshold": 0.3,
"defaultExpireTimeout": 5000,
"expandThreshold": 20,
"expire": false
},
"osd": {
"enabled": true,
"enableBrightness": true,
"enableMicrophone": true,
"hideDelay": 2000
},
"paths": {
"mediaGif": "root:/assets/bongocat.gif",
"sessionGif": "root:/assets/kurukuru.gif",
"wallpaperDir": "~/Pictures/Wallpapers"
},
"services": {
"audioIncrement": 0.1,
"defaultPlayer": "Spotify",
"gpuType": "",
"playerAliases": [
{
"from": "com.github.th_ch.youtube_music",
"to": "YT Music"
}
],
"weatherLocation": "",
"useFahrenheit": false,
"useTwelveHourClock": false,
"smartScheme": true,
"visualiserBars": 45
},
"session": {
"dragThreshold": 30,
"vimKeybinds": false,
"commands": {
"logout": [
"loginctl",
"terminate-user",
""
],
"shutdown": [
"systemctl",
"poweroff"
],
"hibernate": [
"systemctl",
"hibernate"
],
"reboot": [
"systemctl",
"reboot"
]
}
}
}
I don't have nix, plz help :D
{
programs.niri-caelestia-shell = {
enable = true;
with-cli = true;
settings.theme.accent = "#ffb86c";
};
}
The profile picture for the dashboard is read from the file ~/.face, so to set
it you can copy your image to there or set it via the dashboard. It's not a directory.
The wallpapers for the wallpaper switcher are read from ~/Pictures/Wallpapers
by default. To change it, change the wallpapers path in ~/.config/caelestia/shell.json.
To set the wallpaper, you can use the app launcher command > wallpaper.
Q: Can I theme it?
A: Yes, via shell.json (or Nix options if you use Home Manager).
Q: Why does my task manager Intel GPU messed-up? A: GPU monitoring is limited; Intel isnโt supported yet.
Q: Why does it take so long for you to update? A: Civil unrest in my country ๐ฅ
(top 30 of 31)
QML
86.1%
JavaScript
6.3%
C++
6.1%