A minimal, muted-tone Hyprland setup for CachyOS
fish · waybar · rofi · kitty · hyprlock
| Component | Tool |
|---|---|
| Compositor | Hyprland |
| Bar | Waybar |
| Launcher | Rofi (wayland fork) |
| Terminal | Kitty |
| Shell | fish + starship prompt |
| Editor | Neovim (lazy.nvim, LSP, treesitter) |
| Code editor | VS Code (visual-studio-code-bin) |
| Browser | Zen Browser |
| Lockscreen | hyprlock + hypridle |
| Notifications | dunst |
| Logout menu | wlogout |
| Wallpaper | swww (live-switchable) |
| Settings panel | Quickshell (concept-panel) |
| Fetch splash | fastfetch |
| GTK theming | adw-gtk3-dark + nwg-look |
| Qt theming | qt5ct/qt6ct + Kvantum |
Color palette is a custom low-saturation dark theme called concept — muted lavender/rosewater accents on a near-black base, kept consistent across every app (see .config/hypr/colors.conf).
- A fresh CachyOS (or any Arch-based distro) install
- An internet connection (the installer builds
paruif it's missing) - Not running as root
git clone https://github.com/kavoshnik/concept-dots.git
cd concept-dots
./install.shThe script will:
- Install
paru(AUR helper) if it isn't already present - Install all required packages via
pacman+paru - Back up your existing
~/.configentries to~/.config-backup-<timestamp> - Symlink this repo's configs into
~/.config - Install Fisher + fish plugins
- Offer to set
fishas your default shell
After it finishes: reboot or re-login, then pick Hyprland at your display/login manager.
- Edit
~/.config/hypr/monitors.conffor your actual monitor layout (hyprctl monitorsto check names) - Drop a wallpaper at
~/.config/hypr/wallpapers/default.png - Keybinds live in
~/.config/hypr/keybinds.conf— default mod key isSUPER
| Keys | Action |
|---|---|
SUPER + T |
Terminal (kitty) |
SUPER + A |
App launcher (rofi) |
SUPER + Q |
Close window |
SUPER + E |
File manager |
SUPER + B |
Browser (Zen) |
SUPER + S |
Toggle concept-panel (wallpaper/theme switcher) |
SUPER + L |
Lock screen |
SUPER + ESC |
Logout menu |
SUPER + SHIFT + S |
Screenshot (region) |
SUPER + SHIFT + V |
Clipboard history |
SUPER + 1-0 |
Switch workspace |
install.sh will ask at the end whether you want these — both can also be run standalone any time:
./scripts/install-sddm-theme.sh silvia # SilentSDDM login theme, "silvia" preset
./scripts/install-grub-theme.sh # Elegant GRUB2 bootloader theme- SilentSDDM — a polished SDDM login theme. Other bundled presets:
default,rei,ken,everforest,catppuccin-latte/frappe/macchiato/mocha,nord. - Elegant-grub2-themes — a GRUB bootloader theme. Skipped automatically if your system doesn't use GRUB (e.g. systemd-boot). Default install is
forest / window / left / light / 1080p— edit the flags inside the script for other variants.
Press SUPER + S to open a small Quickshell panel with two tabs:
- Wallpaper — a grid of everything in
.config/hypr/wallpapers/. Click one to apply it live viaswww(with a wipe transition). The choice is remembered aswallpapers/current.png, whichhyprlockandfastfetchalso read — so your lockscreen and terminal splash always match the desktop. - Theme — pick between the built-in
concept(default, matches the wallpaper) andaurora(warm amber/mint alt) palettes. Clicking one runsscripts/apply-theme.py, which regenerates the color blocks in every themed config (Hyprland, Waybar, Rofi, Kitty, wlogout, GTK, Neovim, Starship, dunst, fastfetch) from one palette definition and reloads what can reload live (Hyprland, Waybar, dunst). Things that can't repaint live (open Kitty windows, Rofi, Neovim, GTK apps) pick up the new theme the next time they're started.
Adding your own wallpaper: just drop an image into .config/hypr/wallpapers/ — it shows up in the grid automatically, no config needed.
Adding your own theme: add an entry to the THEMES dict at the top of scripts/apply-theme.py (14 hex values), then add a matching card to the theme grid in .config/quickshell/concept-panel/shell.qml. Every themed file already knows how to regenerate itself from any palette that has those 14 keys.
You can also apply a theme without the GUI:
~/.config/concept-dots/scripts/apply-theme.py aurora
~/.config/concept-dots/scripts/apply-theme.py concept
~/.config/concept-dots/scripts/apply-theme.py --listA from-scratch lazy.nvim setup — not a LazyVim/NvChad wrapper — so you can see exactly what's installed and why:
- LSP via mason.nvim + nvim-lspconfig (lua, python, TS/JS, bash, rust preconfigured — add more in
lua/plugins/coding.lua) - Completion via nvim-cmp + LuaSnip
- Treesitter for syntax highlighting/indent
- Telescope for fuzzy finding (
<leader>ff/<leader>fg/<leader>fb) - nvim-tree file explorer (
<leader>e) - gitsigns, which-key, Comment.nvim, flash.nvim, noice.nvim
- Colorscheme: tokyonight, retinted to the
conceptpalette
First launch will bootstrap lazy.nvim and install plugins automatically — give it a minute.
So Firefox, GTK apps, and Qt apps (e.g. qbittorrent, dolphin) don't visually clash with the rest of the setup:
- GTK —
adw-gtk3-dark(a libadwaita-faithful GTK3 theme) + Papirus-Dark icons + Bibata cursors, wired via.config/gtk-3.0/.config/gtk-4.0. Fine-tune further withnwg-look. - Qt —
qt5ct/qt6ctset the platform theme, actual rendering is handled by Kvantum (KvantumDarkbase). Runkvantummanagerif you want to hand-tune the accent color further.
The concept palette was tuned to match .config/hypr/wallpapers/default.png — extracted straight from the wallpaper's pixels (lavender-blue #8a90f0, rose-magenta #e8a0c8, cyan #35a8b4, near-black/near-white base). wallpapers/current.png is a symlink to whichever wallpaper is active — switch it from the concept-panel (SUPER+S) rather than editing it by hand. If you swap in your own wallpaper with very different colors, re-tune (or add) a matching palette in scripts/apply-theme.py for the same cohesive look.
fastfetch and hyprlock both read current.png too — so the login splash, the lockscreen, and the desktop always match.
If SUPER+S does nothing: check qs -c concept-panel runs without errors in a terminal first. Quickshell's QML API has moved around between versions — if shell.qml throws on your version, try the quickshell-git AUR package instead of quickshell, or check quickshell.org/docs for the current PanelWindow/FloatingWindow/IpcHandler syntax; the logic (list files, run a script on click) doesn't change, only the exact API shapes might.
CachyOS is rolling-release, and Hyprland breaks its own config syntax fairly often (window rules were fully rewritten in 0.53, hyprpaper switched to a block-based config in 0.8.0 — this repo has since moved to swww instead, dispatchers like togglesplit/swapsplit were later removed in favor of layoutmsg). If you see Config error in file ... on screen after a system update:
- Check your installed version:
hyprctl version - Check the Hyprland changelog / wiki for the version you're on — breaking changes are usually called out explicitly
- Compare against this repo's configs; syntax drift is the most common cause, not a real misconfiguration
concept-dots/
├── install.sh
├── .config/
│ ├── hypr/ # hyprland.conf, keybinds, rules, colors, lock/idle
│ ├── waybar/ # config.jsonc + style.css
│ ├── rofi/ # config.rasi + theme.rasi
│ ├── kitty/
│ ├── fish/ # config.fish + functions/ + fish_plugins
│ ├── starship.toml
│ ├── dunst/
│ ├── wlogout/
│ ├── fastfetch/
│ ├── nvim/ # lazy.nvim, LSP, treesitter, telescope...
│ ├── gtk-3.0/ gtk-4.0/
│ ├── qt5ct/ qt6ct/
│ ├── Kvantum/
│ └── quickshell/
│ └── concept-panel/ # wallpaper & theme switcher (SUPER+S)
├── scripts/
│ ├── apply-theme.py # regenerates colors across every config
│ ├── apply-wallpaper.sh # live wallpaper switch via swww
│ ├── install-sddm-theme.sh
│ └── install-grub-theme.sh
├── wallpapers/
└── assets/ # screenshots for this README
Palettes are defined once, in scripts/apply-theme.py (THEMES dict), and every themed file gets regenerated from there — see concept-panel above. Files carry BEGIN CONCEPT-THEME / END CONCEPT-THEME markers (or # @concept:key line tags where the format doesn't support blocks — dunst, starship, fastfetch) showing exactly what gets rewritten. Editing colors by hand inside those markers works fine until the next theme switch overwrites them — for a permanent change, edit the palette in apply-theme.py instead.
MIT — do whatever you want with it.
