A modular desktop shell configuration built with QuickShell and QtQuick, designed for Wayland compositors and tuned for Hyprland.
The project focuses on:
- clean component boundaries (
components/,modules/,services/) - dynamic theming via
pywal - responsive UI behavior with smooth QML/scenegraph rendering
- practical day-to-day features (OSD, notifications, launcher, dashboard, sidebar)
- Screenshots
- Core Capabilities
- Architecture
- Requirements
- Installation
- Running and Reloading
- Configuration Reference
- Hyprland Integration
- Project Layout
- Troubleshooting
- Contributing & Code of Conduct
- License
- Security
- See CONTRIBUTING.md for contribution guidelines, PR process, and testing instructions.
- See CODE_OF_CONDUCT.md for expected community behavior and reporting guidance.
- See SECURITY.md for how to report security vulnerabilities and the project's response process.
- Preferred disclosure path: GitHub Security Advisories. Do not publicly disclose confirmed vulnerabilities until a fix or coordinated disclosure is available.
| Main Desktop | Control Center + Popups | Notifications |
|---|---|---|
![]() |
![]() |
![]() |
- Dynamic wallpaper-driven color integration using
pywal - Persistent shell modules for bar, OSD, notifications, dashboard, launcher, and sidebar
- Notification server support (configurable) with action/image support
- Service layer for audio, brightness, Bluetooth, network, battery, and player state
- Hardware-accelerated QML transitions and shader-backed visual effects
The shell entry point is shell.qml, which wires core services and top-level windows/loaders.
components/: reusable primitives (buttons, elevation, flickable/list wrappers, effects)modules/: product-level UI areas (bar, control center, dashboard, launcher, notifications, OSD)services/: system integrations and data providersconfig/: typed QML config accessors and appearance tokensshell.json: user-tunable runtime configuration loaded byconfig/Config.qml
This separation keeps UI concerns, system logic, and user settings independent and easier to maintain.
- QuickShell
v0.2+ - Qt
6.10+ - Wayland compositor (Hyprland recommended)
| Dependency | Purpose |
|---|---|
python-pywal |
dynamic theme generation (~/.cache/wal/colors.json) |
pipewire, wireplumber, pamixer, playerctl |
audio control and media metadata |
networkmanager |
network state and controls |
bluez, bluez-utils |
Bluetooth state and device management |
upower, power-profiles-daemon |
battery and power profile integration |
grim, slurp |
Wayland screenshots |
brightnessctl |
display brightness control |
cd ~/.config
git clone git@github.com:tripathiji1312/quickshell.git
cd quickshellThe script checks/install missing dependencies, validates QuickShell availability, verifies pywal, and appends Hyprland layer config when needed.
chmod +x setup.sh
./setup.shwal -i /path/to/wallpaperWithout this step, theme-dependent colors can appear missing.
Start manually:
quickshellReload safely after changes:
./reload-quickshell.shThe reload script:
- stops existing
quickshellinstances - force-kills only if needed
- launches a fresh background instance
Autostart with Hyprland:
exec-once = quickshell
The runtime config file is shell.json.
appearance.fontFamily,appearance.materialIconFontpaths.pywalColors,paths.screenshotsDirosd.volumeTimeoutMs,osd.brightnessTimeoutMsnotifications.popupWidth,notifications.maxVisible,notifications.timeoutMs,notifications.registerServerlauncher.enabled,launcher.width,launcher.maxResults,launcher.terminalCommand,launcher.favoritessidebar.enabled,sidebar.width,sidebar.maxHistorydashboard.enabled,dashboard.width,dashboard.height
Changes are watched and reloaded by config/Config.qml through FileView.
The setup script can append the following line to your Hyprland config:
source = ~/.config/quickshell/hyprland-layer-config.conf
If you prefer manual setup, add it yourself to ~/.config/hypr/hyprland.conf.
~/.config/quickshell/
├── assets/ # icons, images, shaders
├── components/ # reusable QML primitives and effects
├── config/ # config singletons and design tokens
├── modules/ # shell features (bar, OSD, dashboard, etc.)
├── services/ # system integrations and state providers
├── shell.json # user settings
├── shell.qml # shell entry point
├── reload-quickshell.sh # safe shell restart helper
├── setup.sh # dependency + environment bootstrap
└── hyprland-layer-config.conf # Hyprland layer-shell behavior tuning
- run
wal -i /path/to/wallpaper - verify file exists:
~/.cache/wal/colors.json - confirm
shell.json -> paths.pywalColorspoints to the correct file
- set
notifications.registerServerinshell.json - disable it if another notification daemon should remain primary
- ensure required services are running:
systemctl --user status wireplumbersystemctl status NetworkManagersystemctl status bluetooth
- confirm Hyprland sources
hyprland-layer-config.conf - reload Hyprland config after changes
- Keep module logic in
modules/and system access inservices/ - Prefer extending existing reusable controls from
components/ - Validate config changes through
shell.jsonand reload with./reload-quickshell.sh
MIT. See LICENSE.


