Dynamic Glacier is an experimental QML/Quickshell dynamic-island style widget for Hyprland.
It is built for people who want a native Linux island surface without Electron, webviews, AGS, EWW, or a JS/HTML/CSS UI stack. The project focuses on a small OLED-friendly black handle that expands only when you hover, click, or when a useful desktop event appears.
Dynamic Glacier is designed to run nicely next to end-4/dots-hyprland.
The current prototype deliberately avoids owning global desktop services that end-4 already handles well. For example, it does not register a standalone notification daemon by default, and volume feedback is only a subtle trace around the island instead of a second full volume OSD.
The goal is to be an optional companion widget for end-4 style Hyprland setups: minimal, black, Quickshell-native, and easy to wire into an existing dotfiles tree.
Early prototype. Dynamic Glacier currently ships as a standalone Quickshell config with animated island states, manual IPC triggers, and live links for MPRIS media, PipeWire volume/privacy state, and UPower battery data.
Notifications are intentionally bridge/IPC-first for now. A direct notification server may be added later, but it should not fight existing notification services in end-4 based setups.
- Pure-black top-center island for Hyprland.
- Small constant reserved zone so normal windows do not jump around.
- Hover expansion may overlap windows instead of resizing the layout.
- OLED-friendly idle handle with
bumpand barely visiblestripmodes. - Compact media player for MPRIS players with artwork, timeline, seek, previous, play/pause, and next.
- Subtle open U-shaped volume trace instead of a duplicate volume mixer.
- Battery text on hover through UPower.
- Microphone/camera privacy dot through PipeWire plus small local fallbacks.
- Focused-monitor placement under Hyprland.
- IPC commands for manual testing and integration scripts.
Dynamic Glacier is distributed as a named Quickshell config, which matches the official Quickshell distribution guidance for dotfile-style shells.
- Download the repository:
git clone https://github.com/mavxa/DynamicGlacier.git
cd DynamicGlacier- Run the installer:
bash install.shWhat the installer does:
- installs runtime dependencies on supported distros
- refreshes the font cache so
Noto Sansis available - installs the config into
~/.config/quickshell/DynamicGlacier - installs a launcher into
~/.local/bin/dynamic-glacier - registers
exec-once = ~/.local/bin/dynamic-glacierin~/.config/hypr/hyprland.confwhen that file exists
Supported dependency setup:
- Arch Linux: installs main runtime packages with
pacman, then installsquickshellfrom the AUR viayayorparuif available - Fedora: enables the official
errornointernet/quickshellCOPR and installsquickshellplus runtime packages withdnf - Debian/Ubuntu: installs runtime packages, but Quickshell still needs to be installed manually because the official Quickshell docs do not currently document an apt package path
Installer options:
bash install.sh --symlink
bash install.sh --skip-deps
bash install.sh --doctor--symlink: use a symlink to the repo instead of copying files into~/.config--skip-deps: only install the config and launcher--no-autostart: do not modify the Hyprland config--hyprland-conf /path/to/hyprland.conf: use a non-default Hyprland config file--doctor: verify that Quickshell, the installed config, fonts, helper tools, and Hyprland autostart are in place
If your distro is not covered by the script, install Quickshell first from the official docs, then run:
bash install.sh --skip-depsOfficial references:
- Quickshell install/setup: https://quickshell.outfoxxed.me/docs/guide/install-setup/
- Quickshell distribution paths: https://quickshell.outfoxxed.me/docs/guide/distribution/
After installation:
~/.local/bin/dynamic-glacierBy default the installer appends an exec-once entry to ~/.config/hypr/hyprland.conf. If you use a different Hyprland config path, pass it during install:
bash install.sh --hyprland-conf /path/to/hyprland.confFrom the repo root:
quickshell --path quickshellTrigger states from another terminal:
quickshell ipc --path quickshell call dynamicGlacier demo
quickshell ipc --path quickshell call dynamicGlacier notify "Build finished" "Dynamic Glacier is alive" "Hello"
quickshell ipc --path quickshell call dynamicGlacier media "Night Drive" "Glacier FM" true ""
quickshell ipc --path quickshell call dynamicGlacier volume 72 false
quickshell ipc --path quickshell call dynamicGlacier toggleHandle
quickshell ipc --path quickshell call dynamicGlacier live true
quickshell ipc --path quickshell call dynamicGlacier idleToggle the looping demo:
quickshell ipc --path quickshell call dynamicGlacier demoLoopRun the doctor mode:
bash install.sh --doctorIt checks quickshell, the installed config, launcher, Noto Sans, helper commands (playerctl, upower, pactl, fuser), and whether the Hyprland autostart entry is present.
To remove the installed config, launcher, and managed Hyprland autostart entry:
bash uninstall.shFor non-interactive removal:
bash uninstall.sh --yesIf you use a non-default Hyprland config path, pass it here too:
bash uninstall.sh --hyprland-conf /path/to/hyprland.conf- Use it as a separate Quickshell config while developing:
quickshell --path quickshell. - If you want to test manually before enabling autostart, install with
bash install.sh --no-autostartand add autostart later. - If you use end-4 dots, keep its existing notification service enabled and use Dynamic Glacier IPC/bridge hooks for notification experiments.
- If end-4 already shows a volume OSD, keep Dynamic Glacier volume feedback subtle. The island should complement that setup, not duplicate it.
Developer workflow and test commands are in docs/development.md.
- end-4 dots: https://github.com/end-4/dots-hyprland
- Quickshell docs: https://quickshell.outfoxxed.me/docs/