caelestia-shell

![GitHub last commit](https://img.shields.io/github/last-commit/caelestia-dots/shell?style=for-the-badge&labelColor=101418&color=9ccbfb) ![GitHub Repo stars](https://img.shields.io/github/stars/caelestia-dots/shell?style=for-the-badge&labelColor=101418&color=b9c8da) ![GitHub repo size](https://img.shields.io/github/repo-size/caelestia-dots/shell?style=for-the-badge&labelColor=101418&color=d3bfe6) [![Ko-Fi donate](https://img.shields.io/badge/donate-kofi?style=for-the-badge&logo=ko-fi&logoColor=ffffff&label=ko-fi&labelColor=101418&color=f16061&link=https%3A%2F%2Fko-fi.com%2Fsoramane)](https://ko-fi.com/soramane) [![Discord invite](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fdiscordapp.com%2Fapi%2Finvites%2FBGDCFCmMBk%3Fwith_counts%3Dtrue&query=approximate_member_count&style=for-the-badge&logo=discord&logoColor=ffffff&label=discord&labelColor=101418&color=96f1f1&link=https%3A%2F%2Fdiscord.gg%2FBGDCFCmMBk)](https://discord.gg/BGDCFCmMBk)
https://github.com/user-attachments/assets/0840f496-575c-4ca6-83a8-87bb01a85c5f ## Components - Widgets: [`Quickshell`](https://quickshell.outfoxxed.me) - Window manager: [`Hyprland`](https://hyprland.org) - Dots: [`caelestia`](https://github.com/caelestia-dots) ## Installation > [!NOTE] > This repo is for the desktop shell of the caelestia dots. If you want installation instructions > for the entire dots, head to [the main repo](https://github.com/caelestia-dots/caelestia) instead. ### Arch linux > [!NOTE] > If you want to make your own changes/tweaks to the shell do NOT edit the files installed by the AUR > package. Instead, follow the instructions in the [manual installation section](#manual-installation). The shell is available from the AUR as `caelestia-shell`. You can install it with an AUR helper like [`yay`](https://github.com/Jguer/yay) or manually downloading the PKGBUILD and running `makepkg -si`. A package following the latest commit also exists as `caelestia-shell-git`. This is bleeding edge and likely to be unstable/have bugs. Regular users are recommended to use the stable package (`caelestia-shell`). ### Nix You can run the shell directly via `nix run`: ```sh nix run github:caelestia-dots/shell ``` Or add it to your system configuration: ```nix { inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; caelestia-shell = { url = "github:caelestia-dots/shell"; inputs.nixpkgs.follows = "nixpkgs"; }; }; } ``` The package is available as `caelestia-shell.packages..default`, which can be added to your `environment.systemPackages`, `users.users..packages`, `home.packages` if using home-manager, or a devshell. The shell can then be run via `caelestia-shell`. > [!TIP] > The default package does not have the CLI enabled by default, which is required for full funcionality. > To enable the CLI, use the `with-cli` package. For home-manager, you can also use the Caelestia's home manager module (explained in [configuring](https://github.com/caelestia-dots/shell?tab=readme-ov-file#home-manager-module)) that installs and configures the shell and the CLI. ### Manual installation Dependencies: - [`caelestia-cli`](https://github.com/caelestia-dots/cli) - [`quickshell-git`](https://quickshell.outfoxxed.me) - this has to be the git version, not the latest tagged version - [`ddcutil`](https://github.com/rockowitz/ddcutil) - [`brightnessctl`](https://github.com/Hummer12007/brightnessctl) - [`app2unit`](https://github.com/Vladimir-csp/app2unit) - [`libcava`](https://github.com/LukashonakV/cava) - [`networkmanager`](https://networkmanager.dev) - [`lm-sensors`](https://github.com/lm-sensors/lm-sensors) - [`fish`](https://github.com/fish-shell/fish-shell) - [`aubio`](https://github.com/aubio/aubio) - [`libpipewire`](https://pipewire.org) - `glibc` - `qt6-declarative` - `gcc-libs` - [`material-symbols`](https://fonts.google.com/icons) - [`caskaydia-cove-nerd`](https://www.nerdfonts.com/font-downloads) - [`swappy`](https://github.com/jtheoof/swappy) - [`libqalculate`](https://github.com/Qalculate/libqalculate) - [`bash`](https://www.gnu.org/software/bash) - `qt6-base` - `qt6-declarative` Build dependencies: - [`cmake`](https://cmake.org) - [`ninja`](https://github.com/ninja-build/ninja) To install the shell manually, install all dependencies and clone this repo to `$XDG_CONFIG_HOME/quickshell/caelestia`. Then simply build and install using `cmake`. ```sh cd $XDG_CONFIG_HOME/quickshell git clone https://github.com/caelestia-dots/shell.git caelestia cd caelestia cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/ cmake --build build sudo cmake --install build ``` > [!TIP] > You can customise the installation location via the `cmake` flags `INSTALL_LIBDIR`, `INSTALL_QMLDIR` and > `INSTALL_QSCONFDIR` for the libraries (the beat detector), QML plugin and Quickshell config directories > respectively. If changing the library directory, remember to set the `CAELESTIA_LIB_DIR` environment > variable to the custom directory when launching the shell. > > e.g. installing to `~/.config/quickshell/caelestia` for easy local changes: > > ```sh > mkdir -p ~/.config/quickshell/caelestia > cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/ -DINSTALL_QSCONFDIR=~/.config/quickshell/caelestia > cmake --build build > sudo cmake --install build > sudo chown -R $USER ~/.config/quickshell/caelestia > ``` ## Usage The shell can be started via the `caelestia shell -d` command or `qs -c caelestia`. If the entire caelestia dots are installed, the shell will be autostarted on login via an `exec-once` in the hyprland config. ### Shortcuts/IPC All keybinds are accessible via Hyprland [global shortcuts](https://wiki.hyprland.org/Configuring/Binds/#dbus-global-shortcuts). If using the entire caelestia dots, the keybinds are already configured for you. Otherwise, [this file](https://github.com/caelestia-dots/caelestia/blob/main/hypr/hyprland/keybinds.conf#L1-L39) contains an example on how to use global shortcuts. All IPC commands can be accessed via `caelestia shell ...`. For example ```sh caelestia shell mpris getActive trackTitle ``` The list of IPC commands can be shown via `caelestia shell -s`: ``` $ caelestia shell -s target drawers function toggle(drawer: string): void function list(): string target notifs function clear(): void target lock function lock(): void function unlock(): void function isLocked(): bool target mpris function playPause(): void function getActive(prop: string): string function next(): void function stop(): void function play(): void function list(): string function pause(): void function previous(): void target picker function openFreeze(): void function open(): void target wallpaper function set(path: string): void function get(): string function list(): string ``` ### PFP/Wallpapers 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. 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 command `caelestia wallpaper`. Use `caelestia wallpaper -h` for more info about the command. ## Updating If installed via the AUR package, simply update your system (e.g. using `yay`). If installed manually, you can update by running `git pull` in `$XDG_CONFIG_HOME/quickshell/caelestia`. ```sh cd $XDG_CONFIG_HOME/quickshell/caelestia git pull ``` ## Configuring All configuration options should be put in `~/.config/caelestia/shell.json`. This file is _not_ created by default, you must create it manually. Options that you omit from the config file will use their default values. ### Per-monitor configuration You can configure options per-monitor in `~/.config/caelestia/monitors//shell.json`. Options set in this file will **override** the respective options in the global config. Otherwise, the options will use their values from the global config. For example, to disable the bar on DP-1: **`~/.config/caelestia/monitors/DP-1/shell.json`** ```json { "bar": { "persistent": false } } ``` > [!NOTE] > Not all options are respect per-monitor overrides. Most notably, the following options will only read > from the global config, and ignore the respective option in per-monitor config files. > >
Ignored options > > - `appearance` (`anim`, `transparency`) > - `general` (`logo`, `apps`, `idle`, `battery`) > - `bar.workspaces` (`perMonitorWorkspaces`, `specialWorkspaceIcons`, `windowIcons`) > - `bar.tray` (`iconSubs`, `hiddenIcons`) > - `dashboard` (`mediaUpdateInterval`, `resourceUpdateInterval`) > - `launcher` (`specialPrefix`, `actionPrefix`, `enableDangerousActions`, `vimKeybinds`, > `favouriteApps`, `hiddenApps`, `actions`) > - `launcher.useFuzzy` (`apps`, `actions`, `schemes`, `variants`, `wallpapers`) > - `notifs` (`expire`, `fullscreen`, `defaultExpireTimeout`, `actionOnClick`) > - `lock` (`enableFprint`, `maxFprintTries`) > - `utilities` (`toasts`, `vpn`) > - `services` (`weatherLocation`, `useFahrenheit`, `useFahrenheitPerformance`, `useTwelveHourClock`, > `gpuType`, `visualiserBars`, `audioIncrement`, `brightnessIncrement`, `maxVolume`, `smartScheme`, > `defaultPlayer`, `playerAliases`, `showLyrics`, `lyricsBackend`) > - `paths` (`wallpaperDir`, `lyricsDir`) > >
### Example configuration > [!NOTE] > The example configuration includes ALL configuration options in `shell.json`. You are > **not** recommended to copy and paste this entire configuration into `shell.json`. > This is meant to serve as a reference of all the available options, and you should > only add the ones you want to change to `shell.json`.
Example ```json { "enabled": true, "appearance": { "deformScale": 1, "anim": { "durations": { "scale": 1 } }, "font": { "family": { "clock": "Rubik", "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": { "logo": "caelestia", "showOverFullscreen": false, "mediaGifSpeedAdjustment": 300, "sessionGifSpeed": 0.7, "apps": { "terminal": ["foot"], "audio": ["pavucontrol"], "playback": ["mpv"], "explorer": ["thunar"] }, "battery": { "warnLevels": [ { "level": 20, "title": "Low battery", "message": "You might want to plug in a charger", "icon": "battery_android_frame_2" }, { "level": 10, "title": "Did you see the previous message?", "message": "You should probably plug in a charger now", "icon": "battery_android_frame_1" }, { "level": 5, "title": "Critical battery level", "message": "PLUG THE CHARGER RIGHT NOW!!", "icon": "battery_android_alert", "critical": true } ], "criticalLevel": 3 }, "idle": { "lockBeforeSleep": true, "inhibitWhenAudio": true, "timeouts": [ { "timeout": 180, "idleAction": "lock" }, { "timeout": 300, "idleAction": "dpms off", "returnAction": "dpms on" }, { "timeout": 600, "idleAction": ["systemctl", "suspend-then-hibernate"] } ] } }, "background": { "desktopClock": { "enabled": false, "scale": 1.0, "position": "bottom-right", "shadow": { "enabled": true, "opacity": 0.7, "blur": 0.4 }, "background": { "enabled": false, "opacity": 0.7, "blur": true }, "invertColors": false }, "enabled": true, "visualiser": { "blur": false, "enabled": false, "autoHide": true, "rounding": 1, "spacing": 1 } }, "bar": { "activeWindow": { "compact": false, "inverted": false, "showOnHover": true }, "clock": { "background": false, "showDate": false, "showIcon": true }, "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 } ], "persistent": true, "popouts": { "activeWindow": true, "statusIcons": true, "tray": true }, "scrollActions": { "brightness": true, "workspaces": true, "volume": true }, "showOnHover": true, "status": { "showAudio": false, "showBattery": true, "showBluetooth": true, "showKbLayout": false, "showMicrophone": false, "showNetwork": true, "showWifi": true, "showLockStatus": true }, "tray": { "background": false, "compact": false, "iconSubs": [], "recolour": false }, "workspaces": { "activeIndicator": true, "activeLabel": "󰮯", "activeTrail": false, "label": " ", "occupiedBg": false, "occupiedLabel": "󰮯", "perMonitorWorkspaces": true, "showWindows": true, "shown": 5, "specialWorkspaceIcons": [ { "name": "steam", "icon": "sports_esports" } ], "windowIcons": [ { "regex": "steam(_app_(default|[0-9]+))?", "icon": "sports_esports" } ] }, "excludedScreens": [""], "activeWindow": { "inverted": false } }, "border": { "rounding": 25, "smoothing": 32, "thickness": 10 }, "dashboard": { "enabled": true, "showOnHover": true, "showDashboard": true, "showMedia": true, "showPerformance": true, "showWeather": true, "dragThreshold": 50, "mediaUpdateInterval": 500 }, "launcher": { "actionPrefix": ">", "actions": [ { "name": "Calculator", "icon": "calculate", "description": "Do simple math equations (powered by Qalc)", "command": ["autocomplete", "calc"], "enabled": true, "dangerous": false }, { "name": "Scheme", "icon": "palette", "description": "Change the current colour scheme", "command": ["autocomplete", "scheme"], "enabled": true, "dangerous": false }, { "name": "Wallpaper", "icon": "image", "description": "Change the current wallpaper", "command": ["autocomplete", "wallpaper"], "enabled": true, "dangerous": false }, { "name": "Variant", "icon": "colors", "description": "Change the current scheme variant", "command": ["autocomplete", "variant"], "enabled": true, "dangerous": false }, { "name": "Transparency", "icon": "opacity", "description": "Change shell transparency", "command": ["autocomplete", "transparency"], "enabled": false, "dangerous": false }, { "name": "Random", "icon": "casino", "description": "Switch to a random wallpaper", "command": ["caelestia", "wallpaper", "-r"], "enabled": true, "dangerous": false }, { "name": "Light", "icon": "light_mode", "description": "Change the scheme to light mode", "command": ["setMode", "light"], "enabled": true, "dangerous": false }, { "name": "Dark", "icon": "dark_mode", "description": "Change the scheme to dark mode", "command": ["setMode", "dark"], "enabled": true, "dangerous": false }, { "name": "Shutdown", "icon": "power_settings_new", "description": "Shutdown the system", "command": ["systemctl", "poweroff"], "enabled": true, "dangerous": true }, { "name": "Reboot", "icon": "cached", "description": "Reboot the system", "command": ["systemctl", "reboot"], "enabled": true, "dangerous": true }, { "name": "Logout", "icon": "exit_to_app", "description": "Log out of the current session", "command": ["loginctl", "terminate-user", ""], "enabled": true, "dangerous": true }, { "name": "Lock", "icon": "lock", "description": "Lock the current session", "command": ["loginctl", "lock-session"], "enabled": true, "dangerous": false }, { "name": "Sleep", "icon": "bedtime", "description": "Suspend then hibernate", "command": ["systemctl", "suspend-then-hibernate"], "enabled": true, "dangerous": false }, { "name": "Settings", "icon": "settings", "description": "Configure the shell", "command": ["caelestia", "shell", "controlCenter", "open"], "enabled": true, "dangerous": false } ], "dragThreshold": 50, "vimKeybinds": false, "enableDangerousActions": false, "maxShown": 7, "maxWallpapers": 9, "specialPrefix": "@", "useFuzzy": { "apps": false, "actions": false, "schemes": false, "variants": false, "wallpapers": false }, "showOnHover": false, "favouriteApps": [], "hiddenApps": [] }, "lock": { "recolourLogo": false, "hideNotifs": false }, "notifs": { "actionOnClick": false, "clearThreshold": 0.3, "defaultExpireTimeout": 5000, "expandThreshold": 20, "openExpanded": false, "expire": false }, "osd": { "enabled": true, "enableBrightness": true, "enableMicrophone": false, "hideDelay": 2000 }, "paths": { "mediaGif": "root:/assets/bongocat.gif", "sessionGif": "root:/assets/kurukuru.gif", "noNotifsPic": "root:/assets/dino.png", "lockNoNotifsPic": "root:/assets/dino.png", "wallpaperDir": "~/Pictures/Wallpapers", "lyricsDir": "~/Music/lyrics" }, "services": { "audioIncrement": 0.1, "brightnessIncrement": 0.1, "maxVolume": 1.0, "defaultPlayer": "Spotify", "gpuType": "", "playerAliases": [{ "from": "com.github.th_ch.youtube_music", "to": "YT Music" }], "weatherLocation": "", "useFahrenheit": false, "useFahrenheitPerformance": false, "useTwelveHourClock": false, "smartScheme": true, "visualiserBars": 45 }, "session": { "dragThreshold": 30, "enabled": true, "vimKeybinds": false, "icons": { "logout": "logout", "shutdown": "power_settings_new", "hibernate": "downloading", "reboot": "cached" }, "commands": { "logout": ["loginctl", "terminate-user", ""], "shutdown": ["systemctl", "poweroff"], "hibernate": ["systemctl", "hibernate"], "reboot": ["systemctl", "reboot"] } }, "sidebar": { "dragThreshold": 80, "enabled": true }, "utilities": { "enabled": true, "maxToasts": 4, "toasts": { "audioInputChanged": true, "audioOutputChanged": true, "capsLockChanged": true, "chargingChanged": true, "configLoaded": true, "dndChanged": true, "gameModeChanged": true, "kbLayoutChanged": true, "kbLimit": true, "numLockChanged": true, "vpnChanged": true, "nowPlaying": false }, "vpn": { "enabled": true, "provider": [ { "name": "wireguard", "interface": "your-connection-name", "displayName": "Wireguard (Your VPN)", "enabled": false } ] }, "quickToggles": [ { "id": "wifi", "enabled": true }, { "id": "bluetooth", "enabled": true }, { "id": "mic", "enabled": true }, { "enabled": true, "id": "settings" }, { "id": "gameMode", "enabled": true }, { "id": "dnd", "enabled": true }, { "id": "vpn", "enabled": true } ] } } ```
### Advanced configuration > [!WARNING] > Do NOT change any of these options if you do not know what you are doing. These options control the > tokens used internally within the shell, and can cause visual issues if changed. The existence of > the options are also not guaranteed across versions, and may change or be removed without notice. A separate `~/.config/caelestia/shell-tokens.json` file allows editing the internal tokens without touching the source code of the shell. These tokens affect, for example, individual rounding, spacing, padding, font size, animation duration and easing curves tokens, and the sizes of certain components. The appearance scale values in `shell.json` are multiplied against these base token values to produce the final computed values. Per-monitor token overrides are also available at `~/.config/caelestia/monitors//shell-tokens.json`. ### Home Manager Module For NixOS users, a home manager module is also available.
home.nix ```nix programs.caelestia = { enable = true; systemd = { enable = false; # if you prefer starting from your compositor target = "graphical-session.target"; environment = []; }; settings = { bar.status = { showBattery = false; }; paths.wallpaperDir = "~/Images"; }; cli = { enable = true; # Also add caelestia-cli to path settings = { theme.enableGtk = false; }; }; }; ``` The module automatically adds Caelestia shell to the path with **full functionality**. The CLI is not required, however you have the option to enable and configure it.
## FAQ ### Need help or support? You can join the community Discord server for assistance and discussion: https://discord.gg/BGDCFCmMBk ### My screen is flickering, help pls! Try disabling VRR in the hyprland config. You can do this by adding the following to `~/.config/caelestia/hypr-user.conf`: ```conf misc { vrr = 0 } ``` ### I want to make my own changes to the hyprland config! You can add your custom hyprland configs to `~/.config/caelestia/hypr-user.conf`. ### I want to make my own changes to other stuff! See the [manual installation](https://github.com/caelestia-dots/shell?tab=readme-ov-file#manual-installation) section for the corresponding repo. ### I want to disable XXX feature! Please read the [configuring](https://github.com/caelestia-dots/shell?tab=readme-ov-file#configuring) section in the readme. If there is no corresponding option, make feature request. ### How do I make my colour scheme change with my wallpaper? Set a wallpaper via the launcher or `caelestia wallpaper` and set the scheme to the dynamic scheme via the launcher or `caelestia scheme set`. e.g. ```sh caelestia wallpaper -f caelestia scheme set -n dynamic ``` ### My wallpapers aren't showing up in the launcher! The launcher pulls wallpapers from `~/Pictures/Wallpapers` by default. You can change this in the config. Additionally, the launcher only shows an odd number of wallpapers at one time. If you only have 2 wallpapers, consider getting more (or just putting one). ## Credits Thanks to the Hyprland discord community (especially the homies in #rice-discussion) for all the help and suggestions for improving these dots! A special thanks to [@outfoxxed](https://github.com/outfoxxed) for making Quickshell and the effort put into fixing issues and implementing various feature requests. Another special thanks to [@end_4](https://github.com/end-4) for his [config](https://github.com/end-4/dots-hyprland) which helped me a lot with learning how to use Quickshell. Finally another thank you to all the configs I took inspiration from (only one for now): - [Axenide/Ax-Shell](https://github.com/Axenide/Ax-Shell) ## Stonks 📈 Star History Chart