A polished desktop shell for Hyprland.
Fast. Focused. Customizable. Built for the Kairo desktop experience.
Features • Installation • Usage • Configuration • Theming • Development
Kairo Shell is a desktop shell designed for Hyprland, built around a clean visual language, useful desktop controls, and a keyboard-first workflow.
It provides the pieces normally scattered across many independent utilities — a bar, application launcher, clipboard interface, media controls, system controls, notifications, wallpaper management, screenshots, workspace controls, lock screen integration, weather, and more — as one cohesive shell.
Kairo Shell is intended to feel like part of the desktop rather than a collection of unrelated widgets.
The project is built primarily with Quickshell/QML, supported by shell and Python utilities where appropriate, and integrates directly with Hyprland.
Kairo Shell is also designed to be the graphical shell component of the wider Kairo Arch Linux workstation environment.
Kairo — Arch, composed.
Kairo provides a complete shell layer around Hyprland, including:
- Desktop bar and workspace controls
- Application launcher
- Clipboard manager interface
- Notification center
- System and quick-action panels
- Audio and volume controls
- Media controls
- Network interface
- Wallpaper picker
- Screenshot interface
- Lock screen integration
- Brightness controls
- Weather information
- Calendar and time widgets
- Current-window information
- Monitor detection
- Blue-light controls
- User guide and shell settings
The individual components share the same configuration and visual system so the desktop remains consistent.
Kairo Shell focuses specifically on Hyprland.
Rather than maintaining several compositor-specific implementations, Kairo keeps its integration focused and predictable. Workspace switching, window information, screenshots, shell IPC, keybindings, and desktop behavior are designed around a Hyprland session.
Most shell functionality can be triggered directly through the kairo command, making it easy to connect Kairo to Hyprland keybindings.
Examples include:
kairo msg toggle launcher
kairo msg toggle clipboard
kairo msg toggle music
kairo msg toggle system
kairo msg toggle wallpaper
kairo msg toggle calendar
kairo msg toggle network
kairo msg toggle volume
kairo msg toggle guideThis allows the shell UI and your compositor configuration to remain loosely coupled while still working together.
Kairo ships two primary commands:
kairo
kairod
kairo is the user-facing shell command and IPC interface.
kairod manages the shell process and its lifecycle.
For example:
kairod start
kairod stop
kairod statusCheck available commands with:
kairo --help
kairod --helpKairo Shell is intended for an Arch Linux + Hyprland environment.
The exact dependencies depend on which shell functionality you use, but the project expects a working Hyprland desktop and the runtime dependencies used by the included Quickshell configuration and helper scripts.
Clone the repository:
git clone https://github.com/nihitdev/kairo-shell.git
cd kairo-shellInstall the current checkout:
bash install/install.sh --localThe installer places the shell files in the appropriate user directories and installs the kairo and kairod launchers.
After installation, start Kairo with:
kairod startCheck its status with:
kairod statusStop it with:
kairod stopSee all currently supported installer options with:
bash install/install.sh --helpKairo's installer supports local development installations as well as optional Hyprland integration.
For example:
bash install/install.sh --local --integrate-hyprlandReview installer output before enabling compositor integration if you already maintain a heavily customized Hyprland configuration.
Kairo can be started automatically with your Hyprland session.
For a Lua-based Hyprland configuration, the startup command is:
hl.exec_cmd("kairod start")The exact location depends on how your Hyprland configuration is organized.
A common layout is:
~/.config/hypr/
├── hyprland.lua
└── config/
├── autostart.lua
├── keybinds.lua
└── variables.lua
Kairo's shell commands can then be attached to your preferred keybindings.
Example:
hl.bind(mainMod .. " + SPACE", hl.dsp.exec_cmd("kairo msg toggle launcher"))
hl.bind(mainMod .. " + V", hl.dsp.exec_cmd("kairo msg toggle clipboard"))
hl.bind(mainMod .. " + M", hl.dsp.exec_cmd("kairo msg toggle music"))
hl.bind(mainMod .. " + B", hl.dsp.exec_cmd("kairo msg toggle system"))
hl.bind(mainMod .. " + W", hl.dsp.exec_cmd("kairo msg toggle wallpaper"))
hl.bind(mainMod .. " + G", hl.dsp.exec_cmd("kairo msg toggle calendar"))
hl.bind(mainMod .. " + N", hl.dsp.exec_cmd("kairo msg toggle network"))
hl.bind(mainMod .. " + A", hl.dsp.exec_cmd("kairo msg toggle volume"))
hl.bind(mainMod .. " + H", hl.dsp.exec_cmd("kairo msg toggle guide"))You are not required to use these exact bindings. Kairo is deliberately exposed through commands so you can map the shell around your own workflow.
Start the shell:
kairod startInspect its state:
kairod statusReload Kairo:
kairo reloadOpen the launcher:
kairo msg toggle launcherOpen the clipboard:
kairo msg toggle clipboardOpen the system panel:
kairo msg toggle systemOpen wallpaper controls:
kairo msg toggle wallpaperTake a screenshot:
kairo screenshotLock the session:
kairo lockControl brightness:
kairo brightness raise
kairo brightness lowerControl volume:
kairo volume raise
kairo volume lower
kairo volume mute-toggleFor the authoritative list of commands provided by your installed version:
kairo --helpUser configuration is stored under:
~/.config/kairo/
The primary settings file is:
~/.config/kairo/settings.json
This keeps user configuration separate from the installed application files.
Application data is installed under:
~/.local/share/kairo/
The launchers are normally available through:
~/.local/bin/kairo
~/.local/bin/kairod
State generated while the shell is running may be stored beneath:
~/.local/state/kairo/
Keeping configuration, application data, and runtime state separate makes local development and upgrades easier to reason about.
Kairo includes a unified theme system used throughout the shell.
Included theme presets currently include themes such as:
Dracula
Gruvbox
Matugen
Monokai
Nord
Tokyo
Tokyo Storm
The active preset is controlled through Kairo's settings.
Kairo also supports Matugen-based dynamic colors for users who want their desktop palette generated from their wallpaper.
If you prefer a fixed preset instead, Matugen can be disabled and another theme selected.
The long-term visual direction of Kairo focuses on:
- Clean typography
- Strong contrast
- Subtle transparency
- Minimal visual noise
- Consistent spacing
- Smooth interaction
- A desktop that stays out of your way
The goal is not simply to add more widgets. The goal is to make every part of the shell feel like it belongs there.
A simplified view of the repository:
kairo-shell/
├── bin/
│ ├── kairo
│ └── kairod
├── config/
│ └── kairo/
├── docs/
│ └── images/
├── install/
│ ├── install.sh
│ └── modules/
├── nix/
├── src/
│ ├── assets/
│ ├── quickshell/
│ └── scripts/
├── tests/
├── flake.nix
├── LICENSE
├── README.md
└── UPSTREAM.md
Contains the main Kairo CLI and daemon entrypoints.
Contains default Kairo configuration shipped with the project.
Contains the installation system and deployment modules.
Contains the main QML/Quickshell desktop shell implementation.
Contains helper utilities used by shell components.
Contains themes, translations, sounds, icons, tutorial data, and other resources.
Contains regression tests used to protect the Kairo migration and project structure.
Contains Nix packaging and module integration.
Clone the project:
git clone https://github.com/nihitdev/kairo-shell.git
cd kairo-shellCreate your changes in the repository and install the current checkout with:
bash install/install.sh --localRestart Kairo after changes:
kairod stop
kairod startFor shell development, running Kairo from a terminal can also be useful because runtime warnings and QML errors remain visible.
The migration regression suite can be run with:
/usr/bin/python3 -m pytest -q tests/test_migration.pyBefore committing, also check Git whitespace/errors:
git diff --checkA useful basic validation sequence is:
/usr/bin/python3 -m pytest -q tests/test_migration.py
git diff --check
kairo --version
kairod --versionKairo follows a few simple ideas.
The desktop should feel cohesive.
A launcher, bar, notification center, wallpaper picker, and system panel should not feel like five unrelated programs.
Customization should remain possible.
Kairo provides defaults, but the shell should adapt to the person using it rather than forcing one workflow.
Hyprland integration should be explicit.
Shell actions are exposed through commands and IPC so keybindings remain understandable and user-controlled.
Configuration should stay inspectable.
Settings and scripts should remain accessible rather than hiding everything behind opaque state.
Visual polish should serve usability.
Animations, transparency, color, and effects should make interactions clearer — not turn the desktop into a benchmark.
Kairo Shell is designed as the graphical desktop-shell component of the wider Kairo project.
The broader Kairo environment focuses on building a reproducible and customizable Arch Linux workstation while keeping the user's existing system and preferences in mind.
Kairo Shell handles the interactive desktop layer:
Kairo
│
├── Workstation setup
├── Dotfiles
├── Development environment
├── Hyprland configuration
│
└── Kairo Shell
├── Bar
├── Launcher
├── Notifications
├── Clipboard
├── System controls
├── Media
├── Wallpapers
└── Desktop utilities
The goal is eventually to make installing Kairo Shell through the main Kairo installer as natural as installing any other Kairo module.
Kairo Shell is actively evolving.
Current areas of work include:
- Further Kairo-specific visual identity
- Monochrome/default Kairo theme
- Runtime warning cleanup
- QML reliability improvements
- Improved first-run experience
- Better Hyprland integration
- Installer polish
- More robust configuration validation
- Improved documentation
- Additional screenshots and previews
- Integration with the main Kairo installer
The project intentionally favors incremental improvements over large rewrites where possible.
Contributions, testing, bug reports, documentation improvements, and ideas are welcome.
When contributing, try to keep changes focused and easy to review.
For larger changes, consider explaining:
- What problem the change solves
- Why the current behavior is insufficient
- How the new behavior works
- Whether configuration compatibility changes
- Whether new dependencies are introduced
For code changes, run the relevant tests before opening a pull request.
Kairo Shell is a modified fork and continuation of Serpantinum, originally developed by ilyamiro.
Kairo preserves the upstream project's licensing and attribution while developing a separate Kairo-focused direction, including project rebranding, Hyprland-focused integration, configuration changes, installer changes, shell behavior, testing, and additional project-specific development.
Upstream attribution and migration information are documented in:
UPSTREAM.md
docs/MIGRATION.md
Historical references to Serpantinum may intentionally remain where they document project history, attribution, or migration behavior.
Those references should not be mechanically removed when doing so would erase meaningful project history or licensing context.
Kairo Shell is distributed under the GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later) in accordance with the upstream project's licensing requirements.
See:
LICENSE
for the full license text.
Upstream copyright and attribution remain applicable to code derived from Serpantinum.
Kairo Shell
A focused Hyprland desktop shell.
Built and maintained as part of Kairo by @nihitdev.
