Switches between two Quickshell setups I run — end-4 and caelestia — without restarting Hyprland. Uses a frozen-frame overlay so the new shell loads hidden behind it. Has a rofi menu that picks up the shell's Material You colors, shows status and lets you switch, restart or stop.
Other Quickshell shells can be plugged in too, see Adding a new shell.
| Package | Purpose |
|---|---|
quickshell |
the shells |
hyprland |
compositor (≥ 0.41) |
rofi (wayland) |
menu |
grim |
freeze frame |
ags (≥ 3) |
transition overlay |
python3 |
color extraction |
app2unit |
systemd launch (optional) |
papirus-icon-theme |
menu icons |
git clone https://github.com/kellyson71/hypr-shell-switcher
cd hypr-shell-switcher
./install.shThen add to your keybinds:
bind = Super+Control, Tab, exec, ~/.config/hypr/scripts/switch-shell.sh toggle
bind = Super+Control+Shift, Tab, exec, ~/.config/hypr/scripts/switch-shell.sh menu| Shortcut | Action |
|---|---|
Super+Control+Tab |
switch to next shell |
Super+Control+Shift+Tab |
open menu |
switch-shell.sh toggle
switch-shell.sh caelestia
switch-shell.sh end4
switch-shell.sh menu~/.config/hypr/
├── active-profile.conf # overwritten on each switch
├── caelestia-overrides.conf
├── assets/
│ └── illogical-impulse.svg
├── profiles/
│ ├── end4.conf
│ └── caelestia.conf
└── scripts/
├── switch-shell.sh
├── transition.ts
└── shell-colors.py
Each profile sets $qsConfig (which Quickshell folder to load). On switch: waits for rofi to close, takes a screenshot with grim, puts it on the Wayland OVERLAY layer via ags, reloads Hyprland with the new profile, restarts qs, then fades out when the shell answers IPC.
Per-shell keybind overrides are loaded conditionally:
source = active-profile.conf
# hyprlang if isCaelestia
source = caelestia-overrides.conf
# hyprlang endifAdd a profile at hypr/profiles/<name>.conf, register it in shell_list(), shell_label(), shell_icon() and shell_desc() inside switch-shell.sh, and optionally drop an SVG in hypr/assets/ and a keybind override file alongside.

