A complete, reproducible Niri Wayland desktop environment for Arch Linux.
Neovim
Power Menu
Wallpaper Picker
btop
Cava
This repository reproduces a complete Niri desktop environment from a fresh Arch Linux install. It includes:
Niri — scrollable tiling compositor with blur, animations, and rounded corners
Waybar — modular status bar with player, clipboard, notifications, CPU, memory, power
Fuzzel — fast Wayland-native application launcher
Mako — notification daemon with sakura rice theme
Fish — smart shell with Starship prompt
Alacritty + Kitty — dual terminal setup
Custom scripts — power menu, wallpaper picker, clipboard history, notification history
MIME associations — PDF, images, code, archives, media all configured
Portal configuration — screen sharing and screenshots working out of the box
GTK/Qt theming — adw-gtk3-dark, Papirus-Dark icons, Bibata cursor
# Clone the repository
git clone https://github.com/youngcoder45/Niri-minimal-dots.git
cd Niri-minimal-dots
# Run the installer (installs packages, symlinks configs, sets up everything)
chmod +x install.sh
./install.sh
# Reboot
sudo reboot
That's it. The installer handles:
Package installation (pacman + AUR via yay)
Config symlinking with backups
MIME associations
Wallpaper installation
Portal configuration
Script permissions
Fish as default shell
SDDM enablement
Click to expand full install.sh behavior
Installs packages from packages.txt via pacman -S --needed
Installs yay (AUR helper) if not present
Installs AUR packages via yay (niri-git, brave-bin, vesktop-bin, etc.)
Creates directories (~/.config, ~/.local/bin, ~/Pictures/wallpapers)
Symlinks all config directories from the repo to ~/.config/ (backs up existing)
Links local/bin scripts to ~/.local/bin/
Installs wallpapers from wallpapers/ to ~/Pictures/wallpapers/
Installs MIME associations (mimeapps.list → ~/.config/)
Installs portal configs (xdg-desktop-portal/*.conf → ~/.config/xdg-desktop-portal/)
Fixes hardcoded paths — replaces __HOME__ with actual $HOME in all config files
Sets Fish as default shell
Enables SDDM display manager
Sets executable permissions on all scripts
Keybinding
Action
Mod + Return
Open terminal (Alacritty)
Alt + Return
Open terminal (Kitty)
Mod + Space
Application launcher (Fuzzel)
Mod + B
Open browser (Firefox)
Mod + C
Open code editor (VS Code)
Mod + V
Open Vesktop (Discord)
Mod + E
Open file manager (Nautilus)
Mod + Z
Open Zed editor
Mod + T
Power menu (Wlogout)
Mod + P
Power menu (Fuzzel-based)
Print
Screenshot (Flameshot GUI)
Keybinding
Action
Mod + Q
Close window
Mod + F
Maximize column
Mod + Shift + F
Fullscreen window
Mod + D
Toggle floating
Mod + Shift + V
Switch focus floating/tiling
Mod + W
Toggle tabbed column
Mod + R
Cycle column width
Mod + O
Toggle overview
Mod + H/L
Focus left/right
Mod + J/K
Focus window down/up
Mod + Ctrl + H/J/K/L
Move window
Keybinding
Action
Mod + 1-9
Switch to workspace 1-9
Mod + Ctrl + 1-9
Move window to workspace 1-9
Mod + U/I
Workspace down/up
Mod + Ctrl + U/I
Move window to workspace down/up
Mod + Page_Down/Up
Workspace down/up
Keybinding
Action
Mod + Shift + H/J/K/L
Focus monitor left/down/up/right
Mod + Shift + Ctrl + H/J/K/L
Move window to monitor
Keybinding
Action
XF86AudioRaise/Lower
Volume up/down
XF86AudioMute
Toggle mute
XF86AudioMicMute
Toggle mic mute
XF86AudioPlay/Prev/Next
Media controls
XF86BrightnessUp/Down
Brightness up/down
Keybinding
Action
Print
Screenshot (Flameshot GUI)
Ctrl + Print
Screenshot (current output)
Alt + Print
Screenshot (current window)
Script
Description
Dependencies
powermenu
Fuzzel-based power menu (Shutdown/Reboot/Suspend/Logout/Lock)
fuzzel, systemctl, niri-lock
set-wallpaper
Interactive wallpaper picker using Fuzzel
fuzzel, swaybg
clipboard-history
Browse and select from clipboard history
cliphist, fuzzel, wl-copy
notification-history
Browse notification history
fuzzel, makoctl
mako-history
View Mako notification log
fuzzel
Waybar Scripts (waybar/scripts/)
Script
Description
powermenu.sh
Power menu triggered from waybar
clipboard.sh
Clipboard history/clear from waybar
bluetooth-control.sh
Bluetooth device picker with Fuzzel
bluetooth.sh
Bluetooth status display
volume-control.sh
Volume control with device selection
network-control.sh
Network manager with WiFi scanning
notification-control.sh
Notification history (Python, uses makoctl)
notifications.sh
Notification count display
mediaplayer.sh
Media player status (playerctl)
launch-waybar.sh
Waybar launcher with warning suppression
Configured in mimeapps.list:
Type
Default App
PDF
Zathura
JPEG/PNG/WEBP/GIF
Loupe
SVG
Firefox
Markdown
Obsidian
Plain text
Zed
CSV / XLS / XLSX
Gnumeric
YAML
Zed
HTML
Firefox
Video (mp4)
mpv
Audio (mp3)
mpv
Archives (zip)
FreesmLauncher
Archives (tar)
FileRoller
Directories
Nautilus
HTTP/HTTPS
Firefox
Discord links
Vesktop
Screen sharing and screenshots work via xdg-desktop-portal-gnome. The repository includes:
xdg-desktop-portal/niri-portals.conf — Routes ScreenCast and Screenshot to GNOME backend
xdg-desktop-portal/portals.conf — General fallback (FileChooser/OpenURI/Print → GTK)
These are installed to ~/.config/xdg-desktop-portal/ by the installer.
The following fonts are required (installed by packages.txt):
Font
Package
Used By
FiraCode Nerd Font
ttf-firacode-nerd
Alacritty, Kitty, Waybar
JetBrainsMono Nerd Font
ttf-jetbrains-mono-nerd
Mako notifications
Symbols Nerd Font
ttf-nerd-fonts-symbols
Waybar icon fallback
Noto Sans Emoji
noto-fonts-emoji
Emoji rendering
DejaVu Sans
(base system)
Fuzzel launcher
Component
Theme / Style
GTK Theme
adw-gtk3-dark
Icon Theme
Papirus-Dark
Cursor Theme
Bibata-Modern-Classic
Waybar
Catppuccin Mocha (custom)
Alacritty
Deep navy with sunset accents
Kitty
Glassy Frost Dracula-inspired
Mako
Sakura rice (pink/purple)
Fuzzel
Catppuccin Mocha overlay
.
├── alacritty/
│ └── alacritty.toml # Terminal config (deep navy theme)
├── bottom/
│ └── bottom.toml # System monitor
├── btop/
│ └── btop.conf # System monitor (glassy frost theme)
├── cava/
│ ├── config # Audio visualizer
│ ├── shaders/
│ └── themes/
├── environment.d/
│ ├── cursors.conf # XCURSOR_THEME, XCURSOR_SIZE
│ └── unset-gtk-theme.conf # Clears GTK_THEME env
├── fastfetch/
│ └── config.jsonc # System info display
├── fish/
│ ├── config.fish # Fish shell config
│ └── conf.d/ # Theme, keybindings, auto-ls
├── flameshot/
│ └── flameshot.ini # Screenshot tool
├── fuzzel/
│ └── fuzzel.ini # App launcher (DejaVu Sans, Catppuccin)
├── godot/
│ └── editor_settings-4.5.tres # Godot editor settings
├── gtk-3.0/
│ ├── settings.ini # GTK3 settings
│ ├── gtk.css
│ ├── colors.css
│ └── bookmarks
├── gtk-4.0/
│ ├── settings.ini # GTK4 settings
│ └── colors.css
├── kitty/
│ ├── kitty.conf # Kitty terminal (Glassy Frost theme)
│ ├── colors.conf
│ └── sessions/
├── lazygit/
│ └── config.yml # Git TUI
├── local/bin/ # Custom scripts
│ ├── powermenu # Fuzzel power menu
│ ├── set-wallpaper # Wallpaper picker
│ ├── clipboard-history # Clipboard manager
│ ├── notification-history # Notification viewer
│ └── mako-history # Mako log viewer
├── mako/
│ └── config # Notifications (sakura rice theme)
├── mpv/
│ ├── mpv.conf # Media player
│ ├── fonts/
│ ├── script-opts/
│ └── scripts/
├── niri/
│ ├── config.kdl # Main Niri config
│ ├── basicsettings.kdl # Input, layout, animations
│ ├── keybinds.kdl # All keybindings
│ ├── window_rules.kdl # Per-app window rules
│ ├── autostart.sh # Startup script
│ └── index.theme # Cursor theme index
├── niri-lock/
│ ├── config.ini # Lock screen config
│ ├── lock.sh # Lock script
│ └── style.css # Lock screen styling
├── nvim/ # LazyVim config
│ ├── init.lua
│ ├── lazy-lock.json
│ └── lua/
├── pomoru/
│ └── config.toml # Pomodoro timer
├── qt6ct/
│ └── qt6ct.conf # Qt6 theme
├── starship/
│ └── starship.toml # Shell prompt
├── swappy/
│ └── config # Screenshot annotation
├── tmux/
│ └── tmux.conf # Terminal multiplexer
├── vlc/
│ └── vlcrc # Media player
├── waybar/
│ ├── config.jsonc # Bar config (11 modules)
│ ├── style.css # Bar styling (Catppuccin Mocha)
│ ├── modules/ # Individual module configs
│ └── scripts/ # 10 custom scripts
├── wlogout/
│ ├── layout # Power menu layout
│ └── style.css # Power menu styling
├── xdg-desktop-portal/
│ ├── niri-portals.conf # Niri portal routing
│ └── portals.conf # General portal fallback
├── zed/
│ ├── settings.json # Zed editor
│ └── snippets/ # Code snippets
├── wallpapers/
│ ├── forest_dark_winter.jpg # Default wallpaper
│ └── rogue.jpg # Alternative wallpaper
├── mimeapps.list # MIME associations
├── packages.txt # Package list (~150 packages)
├── install.sh # Automated installer
├── .gitignore
├── LICENSE
└── README.md
# Place images in ~/Pictures/wallpapers/
# Then use the picker:
~ /.local/bin/set-wallpaper
Or edit niri/autostart.sh to change the default:
swaybg -i " $HOME /Pictures/wallpapers/your-wallpaper.jpg" -m fill &
File
Controls
waybar/style.css
Waybar colors
mako/config
Notification colors
alacritty/alacritty.toml
Alacritty colors
kitty/kitty.conf
Kitty colors
niri-lock/style.css
Lock screen colors
fuzzel/fuzzel.ini
Launcher colors
Edit waybar/config.jsonc to add modules to modules-left, modules-center, or modules-right. Define new modules in waybar/modules/.
Edit font_family in alacritty/alacritty.toml or font_family in kitty/kitty.conf.
# Install the missing symbols font
sudo pacman -S ttf-nerd-fonts-symbols
fc-cache -fv
killall waybar && waybar &
killall waybar
~ /.config/waybar/scripts/launch-waybar.sh
# Test manually
swaybg -i ~ /Pictures/wallpapers/your-wallpaper.jpg -m fill &
# Test niri-lock
niri-lock
Screen sharing not working
# Verify portal config
cat ~ /.config/xdg-desktop-portal/niri-portals.conf
# Should show:
# [preferred]
# default=gnome
# org.freedesktop.impl.portal.ScreenCast=gnome
# org.freedesktop.impl.portal.Screenshot=gnome
# Restart portal
systemctl --user restart xdg-desktop-portal
systemctl --user restart xdg-desktop-portal-gnome
# Rebuild font cache
fc-cache -fv
# Verify fonts are found
fc-match " FiraCode Nerd Font Mono"
fc-match " JetBrainsMono Nerd Font"
This project is licensed under the MIT License — see the LICENSE file for details.
Made with ❤️ by Aditya Verma