手动安装必须使用 quickshell-git 而非最新 tagged 版本;配置文件 ~/.config/caelestia/shell.json 默认不存在需手动创建;default 包不含 CLI,需用 with-cli 包
shell
caelestia-dotsGPL-3.0活跃维护基于 Quickshell 和 Qt6 的 Wayland 桌面 Shell,为 Hyprland 用户提供流畅、可形变的桌面界面与状态栏。
A fluid, morphing shell for your Linux desktop
nix run github:caelestia-dots/shell#with-cliREADME 未说明
基于 Quickshell 的 Hyprland 桌面外壳,提供流畅形变的桌面组件与面板
基于 Quickshell 和 Qt6 的 Wayland 桌面 Shell,为 Hyprland 用户提供流畅、可形变的桌面界面与状态栏。
核心能力
- 用 Quickshell 构建可形变桌面组件
- 通过 Hyprland 全局快捷键触发所有按键绑定
- 用 caelestia shell 命令行执行 IPC 命令
- 支持按显示器覆盖全局配置
- 内置壁纸切换器与启动器动作前缀
容易踩的坑
- v2.5.0最新正式版2026-09-18 · 2026-09-18 13:11 UTC
What's Changed
- chore: add clang tidy by @soramanew in https://github.com/caelestia-dots/shell/pull/1920
- refactor(blobs): namespace stuff in blobs module by @soramanew in https://github.com/caelestia-dots/shell/pull/1924
- ci: add more build checks by @soramanew in https://github.com/caelestia-dots/shell/pull/1925
- style: use u""_s instead of QStringLiteral by @soramanew in https://github.com/caelestia-dots/shell/pull/1929
- perf: use QString literals where missing by @soramanew in https://github.com/caelestia-dots/shell/pull/1930
- style: use u'' instead of QLatin1Char by @soramanew in https://github.com/caelestia-dots/shell/pull/1931
- refactor: disable ascii/bytearray casts by @soramanew in https://github.com/caelestia-dots/shell/pull/1932
- refactor: use scoped enums by @soramanew in https://github.com/caelestia-dots/shell/pull/1933
- fix: filter out container virtual interfaces from the ethernet list by @Mestane in https://github.com/caelestia-dots/shell/pull/1864
- fix: remove bad padding under workspaces icons when "maxWindowIcons" is 0 by @saumon-brule in https://github.com/caelestia-dots/shell/pull/1949
- fix(bar): map popouts to items properly by @soramanew in https://github.com/caelestia-dots/shell/pull/1953
- fix(bar): hide separator only tray menus by @soramanew in https://github.com/caelestia-dots/shell/pull/1955
- refactor(utils): simplify icon matching by @dxnnv in https://github.com/caelestia-dots/shell/pull/1952
- feat(lock): allow toggling password visibility by @soramanew in https://github.com/caelestia-dots/shell/pull/1960
- ci: update commit messages in workflows by @dxnnv in https://github.com/caelestia-dots/shell/pull/1965
- feat(i18n): add translator framework by @soramanew in https://github.com/caelestia-dots/shell/pull/1966
- feat(bar): improve some labels in popouts by @soramanew in https://github.com/caelestia-dots/shell/pull/1967
- chore: add --lint and --file options to lint script by @soramanew in https://github.com/caelestia-dots/shell/pull/1968
- chore(i18n): improve translation context by @soramanew in https://github.com/caelestia-dots/shell/pull/1969
- chore: add trs check script by @soramanew in https://github.com/caelestia-dots/shell/pull/1970
- ci: add pr approval check workflow by @soramanew in https://github.com/caelestia-dots/shell/pull/1975
- ci: ignore non-code files for PR workflow runs by @dxnnv in https://github.com/caelestia-dots/shell/pull/1980
- fix(bar): constrain audio device labels by @stoltembergg-png in https://github.com/caelestia-dots/shell/pull/1958
- fix(core): null-check grabToImage result in saveItem by @Smasduq in https://github.com/caelestia-dots/shell/pull/1973
- feat(nexus): impl language setter by @soramanew in https://github.com/caelestia-dots/shell/pull/1985
- fix(services): collect storage disks asynchronously by @soramanew in https://github.com/caelestia-dots/shell/pull/1986
- fix(picker): handle missing Hypr IPC state by @briankalid in https://github.com/caelestia-dots/shell/pull/1951
- chore(i18n): translate temperature units by @soramanew in https://github.com/caelestia-dots/shell/pull/1987
- chore(i18n): translate units by @soramanew in https://github.com/caelestia-dots/shell/pull/1988
- feat(config)!: convert unit options to enums by @soramanew in https://github.com/caelestia-dots/shell/pull/1989
- feat(config): add services.dataUnit option by @soramanew in https://github.com/caelestia-dots/shell/pull/1990
- fix(dashboard): wrap long weather conditions by @stoltembergg-png in https://github.com/caelestia-dots/shell/pull/1957
- feat: add option for seconds on bar/dash clocks by @soramanew in https://github.com/caelestia-dots/shell/pull/1992
- feat(bar): add option for hiding empty + inactive workspaces by @dxnnv in https://github.com/caelestia-dots/shell/pull/1770
- chore(bar)!: remove perMonitorWorkspaces option by @soramanew in https://github.com/caelestia-dots/shell/pull/1996
- fix: last row by @Mestane in https://github.com/caelestia-dots/shel
- v2.4.02026-08-29 · 2026-08-29 04:39 UTC
查看更新说明
What's Changed
- feat: use pwvucontrol as default audio app by @greiner-petter in https://github.com/caelestia-dots/shell/pull/1820
- services/hypr: fix CapsLock refresh shortcut on Lua Hyprland setups by @Mvkweb in https://github.com/caelestia-dots/shell/pull/1836
- ci: remove legacy controlcenter path from QML linting by @dxnnv in https://github.com/caelestia-dots/shell/pull/1847
- docs: refactor and update
README.mdfor improved clarity by @dxnnv in https://github.com/caelestia-dots/shell/pull/1846 - refactor(config): rewrite config module by @soramanew in https://github.com/caelestia-dots/shell/pull/1861
- fix(bar): filter ignored tags and steam popups from workspace icons by @Mvkweb in https://github.com/caelestia-dots/shell/pull/1848
- nix: refactored flake by @Rexcrazy804 in https://github.com/caelestia-dots/shell/pull/1866
- feat(services): migrate NetworkUsage from QML to native C++ TickingService by @detluck in https://github.com/caelestia-dots/shell/pull/1860
- refactor: rearrange plugin layout by @soramanew in https://github.com/caelestia-dots/shell/pull/1896
- ci: add pr title check workflow by @soramanew in https://github.com/caelestia-dots/shell/pull/1879
- fix(services): prevent duplicate and unknown keyboard layout notifications by @detluck in https://github.com/caelestia-dots/shell/pull/1886
- refactor(config,services): call toaster from c++ by @soramanew in https://github.com/caelestia-dots/shell/pull/1900
- fix(dashboard): don't let the hidden lyrics list take clicks by @Mestane in https://github.com/caelestia-dots/shell/pull/1891
- feat(bar): use material shapes for workspace indicators by @dim-ghub in https://github.com/caelestia-dots/shell/pull/1800
- build: split out m3shapes by @soramanew in https://github.com/caelestia-dots/shell/pull/1909
New Contributors
- @greiner-petter made their first contribution in https://github.com/caelestia-dots/shell/pull/1820
- @Mvkweb made their first contribution in https://github.com/caelestia-dots/shell/pull/1836
- @Rexcrazy804 made their first contribution in https://github.com/caelestia-dots/shell/pull/1866
- @detluck made their first contribution in https://github.com/caelestia-dots/shell/pull/1860
- @dim-ghub made their first contribution in https://github.com/caelestia-dots/shell/pull/1800
Full Changelog: https://github.com/caelestia-dots/shell/compare/v2.3.0...v2.4.0
- v2.3.02026-08-06 · 2026-08-06 10:48 UTC
查看更新说明
What's Changed
- ci: add nix build workflow by @soramanew in https://github.com/caelestia-dots/shell/pull/1715
- fix: add qtimageformats to nix qs dep by @soramanew in https://github.com/caelestia-dots/shell/pull/1716
- feat: VPN section with provider management and live stats by @Mestane in https://github.com/caelestia-dots/shell/pull/1605
- feat: cap networks shown in nexus by @soramanew in https://github.com/caelestia-dots/shell/pull/1719
- feat: add saved networks sub page to nexus by @soramanew in https://github.com/caelestia-dots/shell/pull/1722
- feat: add utilities panel confs to nexus by @soramanew in https://github.com/caelestia-dots/shell/pull/1725
- fix: eager load certain services by @soramanew in https://github.com/caelestia-dots/shell/pull/1733
- refactor(weather): change IP-lookup API and enhance request handling by @dxnnv in https://github.com/caelestia-dots/shell/pull/1734
- batterymonitor: fix repeated low battery warnings by @Wekendd in https://github.com/caelestia-dots/shell/pull/1477
- fix: nominatim compliance by @soramanew in https://github.com/caelestia-dots/shell/pull/1752
- fix: use GNUInstallDirs for install dirs by @soramanew in https://github.com/caelestia-dots/shell/pull/1762
- refactor: add RowButton component by @soramanew in https://github.com/caelestia-dots/shell/pull/1768
- feat: add config lists by @soramanew in https://github.com/caelestia-dots/shell/pull/1772
- refactor: typed quick toggles list by @soramanew in https://github.com/caelestia-dots/shell/pull/1774
- refactor: bar status icons -> entries list by @soramanew in https://github.com/caelestia-dots/shell/pull/1761
- fix: weather service typo by @dark3txr in https://github.com/caelestia-dots/shell/pull/1801
- feat(lock): add configurable lock screen background by @dxnnv in https://github.com/caelestia-dots/shell/pull/1802
- feat(nexus): add field for action prefix in launcher panel by @dxnnv in https://github.com/caelestia-dots/shell/pull/1769
- fix: resolve tray icons whose IconThemePath is a theme root by @SaMaili in https://github.com/caelestia-dots/shell/pull/1767
New Contributors
- @Wekendd made their first contribution in https://github.com/caelestia-dots/shell/pull/1477
- @SaMaili made their first contribution in https://github.com/caelestia-dots/shell/pull/1767
Full Changelog: https://github.com/caelestia-dots/shell/compare/v2.2.0...v2.3.0
- v2.2.02026-07-16 · 2026-07-16 12:39 UTC
查看更新说明
What's Changed
- fix: align rtl active window titles by @renbkna in https://github.com/caelestia-dots/shell/pull/1633
- feat: improve text controls by @soramanew in https://github.com/caelestia-dots/shell/pull/1647
- lock: integrate Howdy face recognition by @T-m-m-s in https://github.com/caelestia-dots/shell/pull/1515
- refactor: improve state handling & add component hooks by @soramanew in https://github.com/caelestia-dots/shell/pull/1661
- refactor: use Item instead of Loader for bar entries by @soramanew in https://github.com/caelestia-dots/shell/pull/1663
- chore: fix lint warnings by @soramanew in https://github.com/caelestia-dots/shell/pull/1705
- fix(launcher): restore launcher action filtering by @dxnnv in https://github.com/caelestia-dots/shell/pull/1695
- fix(audio): populate pipewire nodes immediately by @shivanshs9 in https://github.com/caelestia-dots/shell/pull/1699
- fix(config): preserve unknown config keys on save by @dxnnv in https://github.com/caelestia-dots/shell/pull/1675
- fix(NowPlayingToast): support delayed "xesam:artist" property on track change by @shivanshs9 in https://github.com/caelestia-dots/shell/pull/1700
- fix: key ZFS filesystems by pool in storage service by @petar-yotsev in https://github.com/caelestia-dots/shell/pull/1673
- feat: hidden networks, per-network settings and IPv4 config by @Mestane in https://github.com/caelestia-dots/shell/pull/1604
- fix: handle livestream sentinel length in lyrics and media player for twitch as media source by @linusgenz in https://github.com/caelestia-dots/shell/pull/1648
New Contributors
- @T-m-m-s made their first contribution in https://github.com/caelestia-dots/shell/pull/1515
- @shivanshs9 made their first contribution in https://github.com/caelestia-dots/shell/pull/1699
- @petar-yotsev made their first contribution in https://github.com/caelestia-dots/shell/pull/1673
- @linusgenz made their first contribution in https://github.com/caelestia-dots/shell/pull/1648
Full Changelog: https://github.com/caelestia-dots/shell/compare/v2.1.0...v2.2.0
- v2.1.02026-06-27 · 2026-06-27 08:34 UTC
查看更新说明
What's Changed
- feat: add nexus apps page & notification settings by @soramanew in https://github.com/caelestia-dots/shell/pull/1597
- feat: support non-systemd systems by @soramanew in https://github.com/caelestia-dots/shell/pull/1607
- fix: clamp layers property to 0-1 for transparency by @dxnnv in https://github.com/caelestia-dots/shell/pull/1618
- fix: rename "id" properties to pass qmlformat by @dxnnv in https://github.com/caelestia-dots/shell/pull/1564
- chore: remove ci pin by @soramanew in https://github.com/caelestia-dots/shell/pull/1624
- fix(services): localize geocoding APIs and format global city names by @Vikyek in https://github.com/caelestia-dots/shell/pull/1593
- windowinfo: format pid as integer string by @renbkna in https://github.com/caelestia-dots/shell/pull/1622
- fix(media): click-to-seek on position slider and volume slider in audio widget #1493 by @Mestane in https://github.com/caelestia-dots/shell/pull/1539
- Feat/ethernet section by @Mestane in https://github.com/caelestia-dots/shell/pull/1602
- chore: remove unused components by @soramanew in https://github.com/caelestia-dots/shell/pull/1625
- feat: add sidebar showOnHover support and drawers isOpen IPC by @silentone12725 in https://github.com/caelestia-dots/shell/pull/1505
New Contributors
- @dxnnv made their first contribution in https://github.com/caelestia-dots/shell/pull/1618
- @Vikyek made their first contribution in https://github.com/caelestia-dots/shell/pull/1593
- @renbkna made their first contribution in https://github.com/caelestia-dots/shell/pull/1622
- @silentone12725 made their first contribution in https://github.com/caelestia-dots/shell/pull/1505
Full Changelog: https://github.com/caelestia-dots/shell/compare/v2.0.3...v2.1.0
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
https://github.com/user-attachments/assets/0840f496-575c-4ca6-83a8-87bb01a85c5f
Components
- Widgets:
Quickshell - Window manager:
Hyprland - Dots:
caelestia
Installation
[!NOTE] This repo is for Caelestia's desktop shell only. If you want installation instructions for the entire dotfiles (which include this shell), head to the main repo instead.
Arch Linux
[!WARNING] 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.
The shell is available from the AUR as caelestia-shell. You can install it with an AUR helper (recommended),
like paru, or by 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:
nix run github:caelestia-dots/shell#with-cli
Or add it to your system configuration:
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
caelestia-shell = {
url = "github:caelestia-dots/shell";
inputs.nixpkgs.follows = "nixpkgs";
};
};
}
For full functionality, use caelestia-shell.packages.<system>.with-cli, which can be added to your
environment.systemPackages, users.users.<username>.packages, home.packages if using home-manager,
or a devshell. The default package does not include the CLI.
You can then run the shell with caelestia-shell.
For home-manager, you can also use Caelestia's Home Manager module (explained in the configuration section), which installs and configures the shell and CLI.
Manual installation
Dependencies:
caelestia-cliquickshell-git- this has to be the git version, not the latest tagged versionglibcgcc-libsddcutilbrightnessctllibcavanetworkmanagerlm_sensorsaubiolibpipewirelibqalculatepower-profiles-daemonttf-material-symbols-variablettf-rubik-vfttf-cascadia-code-nerdqt6-baseqt6-declarativeqt6-imageformatsqt6-multimediaqt6-m3shapes-gitswappyfishbash
Build dependencies:
[!IMPORTANT] The commands below (and in the "Updating" section) assume
$XDG_CONFIG_HOMEis set. If it is unset, substitute it with the path to your config folder (typically~/.config).
To install the shell manually, install all dependencies and clone this repo to $XDG_CONFIG_HOME/quickshell/caelestia.
Then build and install using CMake.
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, andINSTALL_QSCONFDIRfor the libraries (e.g. the version helper), QML plugin, and Quickshell config directories respectively. If you set theINSTALL_LIBDIRflag, theCAELESTIA_LIB_DIRvariable must also be set to the same directory in your system's environment.For example, installing to
~/.config/quickshell/caelestiafor easy local changes:mkdir -p ~/.config/quickshell/caelestia cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/ -DINSTALL_QSCONFDIR="$HOME/.config/quickshell/caelestia" cmake --build build sudo cmake --install build sudo chown -R $USER ~/.config/quickshell/caelestia
Usage
You can start the shell by running caelestia shell -d (preferred) or qs -c caelestia -n -d.
You may omit -d from the command to keep the shell attached to the current terminal if necessary,
though you likely want it to be detached (so it doesn't close when the terminal is closed).
If using the Caelestia dotfiles, the shell will be autostarted on login
via a hl.on("hyprland.start", ...) function in the Hyprland config.
Shortcuts/IPC
All keybinds are accessible via Hyprland global shortcuts.
If using the Caelestia dotfiles, the keybinds are already configured for you.
Otherwise, the keybinds.lua file
contains an example of how to use global shortcuts.
All IPC commands can be accessed via caelestia shell ..., for example:
caelestia shell mpris getActive trackTitle
You can view the list of available IPC commands by running caelestia shell -s.
PFP/Wallpapers
The profile picture for the dashboard is read from the file ~/.face. You can set it by clicking it in the dashboard,
or by manually copying or symlinking your image to the path.
The wallpapers for the wallpaper switcher are read from ~/Pictures/Wallpapers
by default. To change it, modify paths.wallpaperDir in ~/.config/caelestia/shell.json.
To set the wallpaper, you can type >wallpaper in the launcher to open the wallpaper switcher.
Alternatively, you can also use caelestia wallpaper -f <path_to_wallpaper> to set the wallpaper directly.
Use caelestia wallpaper -h for more info about this command.
Updating
Packaged install (AUR)
If using the full dotfiles or the CLI, run caelestia update to perform a full system update and
update the dots.
Otherwise, if you installed the shell on its own, update your system using your AUR helper (e.g., paru).
Manual install
If you installed the shell manually by cloning the repo, you can update by pulling the changes from git in the local checkout.
For example, if you installed to $XDG_CONFIG_HOME/quickshell/caelestia:
cd $XDG_CONFIG_HOME/quickshell/caelestia
git pull
Configuring
All configuration options belong 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 per-monitor options in ~/.config/caelestia/monitors/<monitor_name>/shell.json.
List the names of your available monitors by running:
hyprctl monitors -j | jq -r '.[].name'
Options set in these files will override the respective options in the global config. Any options not present in per-monitor configs will inherit their values from the global config.
For example, to automatically hide the bar on the monitor named DP-1:
~/.config/caelestia/monitors/DP-1/shell.json
{
"bar": {
"persistent": false
}
}
[!NOTE] Not all options 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.
appearance:anim.*,transparency.*bar.tray:hiddenIcons,iconSubsbar.workspaces:ignoredTags,specialWorkspaceIcons,windowIcons,workspaceIconsdashboard:mediaUpdateInterval,resourceUpdateIntervalgeneral:apps.*,battery.*,idle.*,logolauncher:actionPrefix,actions,enableDangerousActions,favouriteApps,hiddenApps,specialPrefix,useFuzzy.*,vimKeybindslock:enableFprint,enableHowdy,maxFprintTries,maxHowdyTries,triggerHowdyOnWakenexus:networkRescanIntervalnotifs:actionOnClick,defaultExpireTimeout,expire,fullscreen,fullscreenExpireTimeoutpaths:lyricsDir,wallpaperDirservices:audioIncrement,brightnessIncrement,clockFormat,dataUnits,defaultPlayer,gpuType,lyricsBackend,maxVolume,playerAliases,sensorUnits,smartScheme,visualiserBars,weatherLocation,weatherUnitsutilities:gameMode.*,toasts.*,vpn.*
Example configuration
[!WARNING] The example configuration includes ALL configuration options in
shell.json. It is not recommended to copy and paste this entire configuration intoshell.json, as options or their default values may change across updates, resulting in a stale config.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.
{
"enabled": true,
"appearance": {
"deformScale": 1,
"rounding": {
"scale": 1
},
"spacing": {
"scale": 1
},
"padding": {
"scale": 1
},
"font": {
"scale": 1,
"clock": "Rubik",
"workspaces": "Rubik",
"headline": {
"family": "GoogleSansFlex",
"large": {
"size": 32,
"weight": 500,
"italic": false,
"vaxes": { "ROND": 25 }
},
"medium": {
"size": 28,
"weight": 500,
"italic": false,
"vaxes": { "ROND": 25 }
},
"small": {
"size": 24,
"weight": 500,
"italic": false,
"vaxes": { "ROND": 25 }
}
},
"title": {
"family": "GoogleSansFlex",
"large": {
"size": 22,
"weight": 500,
"italic": false,
"vaxes": { "ROND": 25 }
},
"medium": {
"size": 16,
"weight": 500,
"italic": false,
"vaxes": { "ROND": 25 }
},
"small": {
"size": 14,
"weight": 500,
"italic": false,
"vaxes": { "ROND": 25 }
}
},
"body": {
"family": "GoogleSansFlex",
"large": {
"size": 16,
"weight": 400,
"italic": false,
"vaxes": { "ROND": 25 }
},
"medium": {
"size": 14,
"weight": 400,
"italic": false,
"vaxes": { "ROND": 25 }
},
"small": {
"size": 12,
"weight": 400,
"italic": false,
"vaxes": { "ROND": 25 }
}
},
"label": {
"family": "GoogleSansFlex",
"large": {
"size": 14,
"weight": 500,
"italic": false,
"vaxes": { "ROND": 25 }
},
"medium": {
"size": 12,
"weight": 500,
"italic": false,
"vaxes": { "ROND": 25 }
},
"small": {
"size": 11,
"weight": 400,
"italic": false,
"vaxes": { "ROND": 25 }
}
},
"mono": {
"family": "CaskaydiaCove NF",
"large": {
"size": 16,
"weight": 400,
"italic": false,
"vaxes": {}
},
"medium": {
"size": 14,
"weight": 400,
"italic": false,
"vaxes": {}
},
"small": {
"size": 12,
"weight": 400,
"italic": false,
"vaxes": {}
}
},
"icon": {
"family": "Material Symbols Rounded",
"extraLarge": {
"size": 36,
"weight": 400,
"italic": false,
"vaxes": {}
},
"large": {
"size": 24,
"weight": 400,
"italic": false,
"vaxes": {}
},
"medium": {
"size": 18,
"weight": 400,
"italic": false,
"vaxes": {}
},
"small": {
"size": 15,
"weight": 400,
"italic": false,
"vaxes": {}
}
}
},
"anim": {
"durations": {
"scale": 1
}
},
"transparency": {
"enabled": false,
"base": 0.85,
"layers": 0.4
}
},
"general": {
"logo": "",
"showOverFullscreen": false,
"mediaGifSpeedAdjustment": 300,
"sessionGifSpeed": 0.7,
"apps": {
"terminal": ["foot"],
"audio": ["pwvucontrol"],
"playback": ["mpv"],
"explorer": ["thunar"]
},
"idle": {
"lockBeforeSleep": true,
"inhibitWhenAudio": true,
"inhibitWhenCharging": false,
"timeouts": [
{
"timeout": 180,
"idleAction": "lock",
"inhibitWhenAudio": false,
"inhibitWhenCharging": false,
"respectInhibitors": true
},
{
"timeout": 300,
"idleAction": "dpms off",
"returnAction": "dpms on"
},
{
"timeout": 600,
"idleAction": ["suspendThenHibernate"]
}
]
},
"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 <b>now</b>",
"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
}
},
"background": {
"enabled": true,
"wallpaperEnabled": true,
"desktopClock": {
"enabled": false,
"scale": 1.0,
"position": "bottom-right",
"invertColors": false,
"background": {
"enabled": false,
"opacity": 0.7,
"blur": true
},
"shadow": {
"enabled": true,
"opacity": 0.7,
"blur": 0.4
}
},
"visualiser": {
"enabled": false,
"autoHide": true,
"blur": false,
"rounding": 1,
"spacing": 1
}
},
"bar": {
"persistent": true,
"showOnHover": true,
"dragThreshold": 20,
"scrollActions": {
"workspaces": true,
"volume": true,
"brightness": true
},
"popouts": {
"activeWindow": true,
"tray": true,
"statusIcons": true
},
"workspaces": {
"shown": 5,
"activeIndicator": true,
"occupiedBg": false,
"showUnoccupied": true,
"perMonitor": true,
"showWindows": true,
"showWindowsOnSpecialWorkspaces": true,
"maxWindowIcons": 5,
"activeTrail": false,
"displayType": "shapes",
"specialDisplayType": "icons",
"label": " ",
"occupiedLabel": "",
"activeLabel": "",
"capitalisation": "preserve",
"workspaceIcons": [],
"specialWorkspaceIcons": [
{
"name": "special",
"icon": "star"
},
{
"name": "communication",
"icon": "forum"
},
{
"name": "music",
"icon": "music_cast"
},
{
"name": "todo",
"icon": "checklist"
},
{
"name": "sysmon",
"icon": "monitor_heart"
}
],
"ignoredTags": ["hide_in_bar", "xwl_popup"],
"windowIcons": [
{
"regex": "steam(_app_(default|[0-9]+))?",
"icon": "sports_esports"
}
]
},
"activeWindow": {
"compact": false,
"inverted": false,
"showOnHover": true
},
"tray": {
"background": false,
"recolour": false,
"compact": false,
"iconSubs": [],
"hiddenIcons": []
},
"clock": {
"background": false,
"showDate": false,
"showIcon": true
},
"statusIcons": [
{
"id": "lockStatus",
"enabled": true
},
{
"id": "audio",
"enabled": false
},
{
"id": "microphone",
"enabled": false
},
{
"id": "kbLayout",
"enabled": false
},
{
"id": "network",
"enabled": true
},
{
"id": "bluetooth",
"enabled": true
},
{
"id": "battery",
"enabled": true
}
],
"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
}
],
"excludedScreens": []
},
"border": {
"thickness": 10,
"rounding": 25,
"smoothing": 20
},
"dashboard": {
"enabled": true,
"showOnHover": true,
"showDashboard": true,
"showMedia": true,
"showPerformance": true,
"showWeather": true,
"mediaUpdateInterval": 500,
"resourceUpdateInterval": 1000,
"dragThreshold": 50,
"performance": {
"showBattery": true,
"showGpu": true,
"showCpu": true,
"showMemory": true,
"showStorage": true,
"showNetwork": true
}
},
"launcher": {
"enabled": true,
"showOnHover": false,
"maxShown": 7,
"maxWallpapers": 9,
"specialPrefix": "@",
"actionPrefix": ">",
"enableDangerousActions": false,
"dragThreshold": 50,
"vimKeybinds": false,
"favouriteApps": [],
"hiddenApps": [],
"useFuzzy": {
"apps": false,
"actions": false,
"schemes": false,
"variants": false,
"wallpapers": false
},
"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": "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": ["poweroff"],
"enabled": true,
"dangerous": true
},
{
"name": "Reboot",
"icon": "cached",
"description": "Reboot the system",
"command": ["reboot"],
"enabled": true,
"dangerous": true
},
{
"name": "Logout",
"icon": "exit_to_app",
"description": "Log out of the current session",
"command": ["logout"],
"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": ["suspendThenHibernate"],
"enabled": true,
"dangerous": false
},
{
"name": "Settings",
"icon": "settings",
"description": "Configure the shell",
"command": ["caelestia", "shell", "nexus", "open"],
"enabled": true,
"dangerous": false
}
]
},
"lock": {
"enabled": true,
"useWallpaper": false,
"recolourLogo": true,
"enableFprint": true,
"maxFprintTries": 3,
"enableHowdy": true,
"maxHowdyTries": 3,
"triggerHowdyOnWake": true,
"hideNotifs": false,
"enableSessionControls": true
},
"nexus": {
"wallpapersPerRow": 4,
"networkRescanInterval": 15000
},
"notifs": {
"expire": true,
"fullscreen": "On",
"defaultExpireTimeout": 5000,
"fullscreenExpireTimeout": 2000,
"clearThreshold": 0.3,
"expandThreshold": 20,
"actionOnClick": false,
"groupPreviewNum": 3,
"openExpanded": false
},
"osd": {
"enabled": true,
"hideDelay": 2000,
"enableBrightness": true,
"enableMicrophone": false
},
"services": {
"weatherLocation": "",
"weatherUnits": "Auto",
"sensorUnits": "Celsius",
"dataUnits": "Binary",
"clockFormat": "Auto",
"gpuType": "Auto",
"visualiserBars": 60,
"audioIncrement": 0.1,
"brightnessIncrement": 0.1,
"maxVolume": 1.0,
"smartScheme": true,
"defaultPlayer": "Spotify",
"playerAliases": [
{ "from": "com.github.th_ch.youtube_music", "to": "YT Music" }
],
"lyricsBackend": "Auto"
},
"session": {
"enabled": true,
"dragThreshold": 30,
"vimKeybinds": false,
"icons": {
"logout": "logout",
"shutdown": "power_settings_new",
"hibernate": "downloading",
"reboot": "cached"
},
"commands": {
"logout": ["logout"],
"shutdown": ["poweroff"],
"hibernate": ["hibernate"],
"reboot": ["reboot"]
}
},
"sidebar": {
"enabled": true,
"showOnHover": false,
"minHoverThreshold": 200,
"dragThreshold": 80
},
"utilities": {
"enabled": true,
"maxToasts": 4,
"toasts": {
"fullscreen": "off",
"configLoaded": true,
"chargingChanged": true,
"gameModeChanged": true,
"dndChanged": true,
"audioOutputChanged": true,
"audioInputChanged": true,
"capsLockChanged": true,
"numLockChanged": true,
"kbLayoutChanged": true,
"kbLimit": true,
"vpnChanged": true,
"nowPlaying": false
},
"vpn": {
"enabled": false,
"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
},
{
"id": "settings",
"enabled": true
},
{
"id": "gameMode",
"enabled": true
},
{
"id": "dnd",
"enabled": true
},
{
"id": "vpn",
"enabled": false
}
],
"gameMode": {
"options": {
"animations:enabled": 0,
"decoration:blur:enabled": 0,
"decoration:shadow:enabled": 0,
"decoration:rounding": 0,
"general:gaps_in": 0,
"general:gaps_out": 0,
"general:border_size": 1,
"general:allow_tearing": 1
}
}
},
"paths": {
"wallpaperDir": "~/Pictures/Wallpapers",
"lyricsDir": "~/Music/lyrics/",
"sessionGif": "root:/assets/kurukuru.gif",
"mediaGif": "root:/assets/bongocat.gif",
"noNotifsPic": "root:/assets/dino.png",
"lockNoNotifsPic": "root:/assets/dino.png"
}
}
Advanced configuration
[!CAUTION] Do NOT change any of these options unless you know what you are doing. These options control the tokens used internally within the shell, and can cause visual issues if modified incorrectly. The available options may change or be removed without notice across versions.
A separate ~/.config/caelestia/shell-tokens.json file allows editing the internal tokens without
touching the source code of the shell. These tokens affect the dimensions and appearance of visual elements,
including individual rounding, spacing, padding, font size, animation durations and curves, 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/<monitor_name>/shell-tokens.json.
Home Manager Module
For NixOS users, a Home Manager module is also available.
programs.caelestia = {
enable = true;
systemd = {
enable = false; # if you prefer starting from your compositor
target = "graphical-session.target";
environment = [];
};
settings = {
bar.statusIcons = [
{ id = "lockStatus"; enabled = true; }
{ id = "network"; enabled = true; }
{ id = "bluetooth"; enabled = true; }
{ id = "battery"; enabled = false; }
];
paths.wallpaperDir = "~/Images";
};
cli = {
enable = true; # Also add caelestia-cli to path
settings = {
theme.enableGtk = false;
};
};
};
The module automatically adds the shell to the path with full functionality. The CLI is not required; however, you can enable and configure it.
FAQ
Need help or support?
You can join the Caelestia Discord server for assistance and discussion here.
I want to make my own changes to the Hyprland config!
Check out the configuring section on the dots repo.
I want to make my own changes to other stuff!
See the manual installation section for the corresponding repo.
I want to disable ___ feature!
Please read the configuring section. If there is no corresponding option, make a feature request.
How do I make my colour scheme change to match my wallpaper?
Set a wallpaper via >wallpaper in the launcher or caelestia wallpaper, and set the scheme to the dynamic scheme via
>scheme in the launcher or caelestia scheme set, e.g.:
caelestia wallpaper -f <path_to_wallpaper>
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 for making Quickshell and the effort put into fixing issues and implementing various feature requests.
Another special thanks to @end_4 for his config 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):