- niri: switch from replaceStrings patching to plain config.kdl for simplicity - niri: add Mod+Shift+Q (close), Mod+Shift+HJKL/Arrow (move window), Mod+Shift+1-9 (move to workspace) - niri: add layer-rule to disable background-blur on noctalia bar (fix seam) - noctalia: add capsule_group for cpu+ram (group:sysmon), panel_overlap, contact_shadow; corner_radius_scale 1.0 - noctalia: add all LC_* locale overrides in plasma-localerc (fix vi_VN calendar) - system: TLP (battery), UPower, disable power-profiles-daemon (conflicts with TLP) - system: DDC/CI support (ddcutil + i2c-dev + hardware.i2c) - system: enable fish shell system-wide - packages: add tree, fish, ddcutil; noctalia required services documented - README: full rewrite with current structure, keybinds, fresh-install steps
nixos-config
Personal NixOS configuration using flakes + home-manager.
Structure
nixos-config/
├── flake.nix # Inputs and outputs
├── flake.lock # Pinned input versions
├── hosts/
│ └── nixos/
│ ├── configuration.nix # System-level config (kernel, services, users)
│ └── hardware-configuration.nix # Auto-generated, machine-specific (not in git)
└── home/
├── hosts/
│ └── nixos.nix # Home-manager entry point for this machine
└── modules/ # Reusable modules, imported by hosts/nixos.nix
├── niri/
│ ├── default.nix # Niri module (loads config.kdl + sub-modules)
│ ├── config.kdl # Niri compositor config (edit this directly)
│ ├── noctalia/
│ │ ├── default.nix # Noctalia shell settings
│ │ └── wallpapers/ # Wallpaper images (add your own here)
│ └── polkit/
│ └── default.nix # Polkit authentication agent (systemd service)
├── kitty/
│ └── default.nix # Kitty terminal settings
├── cli/
│ └── default.nix # Shell, git, starship, zoxide, fish
└── applications/
└── default.nix # All user packages, KDE/Plasma settings
home/hosts/andhosts/are two different layers:
hosts/= NixOS system config (runs as root)home/hosts/= home-manager user config (runs as your user)When adding a second machine, add one file to each.
What's configured
Desktop
- Niri scrollable-tiling Wayland compositor
- Noctalia shell — bar, launcher, lock screen, wallpaper, idle, notifications (replaces waybar / walker / swaylock / swaybg / mako)
- KDE Plasma 6 via SDDM — available as a secondary session, Breeze Dark theme
- XWayland satellite for X11 app compatibility under Niri
- Polkit via
polkit-kde-agent-1
System
- Locale: English UI (
en_US.UTF-8) everywhere, timezoneAsia/Ho_Chi_Minh - Vietnamese input: fcitx5 + unikey (Telex/VNI), toggle with
Super+Space - Audio: Pipewire (ALSA + PulseAudio compat)
- Bluetooth: enabled + Blueman applet
- Power: TLP (automatic power management), UPower (battery status)
- Display: DDC/CI support for external monitor brightness (
ddcutil) - Fonts: JetBrainsMono Nerd Font, Noto Color Emoji, Font Awesome
Shell
- zsh (default login shell) — autosuggestions, syntax highlighting, starship prompt, zoxide
- fish — available as secondary shell (
fishto launch)
Packages (selection)
| Category | Packages |
|---|---|
| Browsers | firefox, zen-browser |
| AI | claude-desktop, claude-code |
| Terminals | kitty, ghostty, foot |
| Editor | vscodium |
| File manager | thunar + archive plugin + tumbler thumbnails |
| Media | mpv, imv, obs-studio, gimp, kdenlive |
| Office | libreoffice, zathura |
| Chat | telegram-desktop |
| CLI tools | tree, btop, htop, ripgrep, fd, fzf, eza, bat, dust, ncdu, lazygit, delta, yazi, tldr, tokei, jq, yq |
| System | brightnessctl, playerctl, ddcutil, grim, slurp, swappy, pavucontrol, blueman |
Niri keybindings
| Key | Action |
|---|---|
Mod+T |
Open kitty terminal |
Mod+Space |
Noctalia launcher |
Mod+S |
Noctalia control center |
Super+Alt+L |
Lock screen |
Mod+Shift+Q |
Close window |
Mod+H/L or ←/→ |
Focus column left/right |
Mod+J/K or ↓/↑ |
Focus window down/up |
Mod+Shift+H/L or Shift+←/→ |
Move column left/right |
Mod+Shift+J/K or Shift+↓/↑ |
Move window down/up |
Mod+1-9 |
Switch to workspace |
Mod+Shift+1-9 |
Move window to workspace |
Mod+Shift+E |
Quit niri |
Edit keybindings directly in
home/modules/niri/config.kdl.
Reproducing on a fresh machine
1. Install NixOS
Boot the NixOS ISO and install as usual. During partitioning, set up your disks. Choose any desktop — it will be replaced.
2. Clone this repo
nix-shell -p git
git clone <repo-url> ~/nixos-config
cd ~/nixos-config
3. Copy your hardware config
hardware-configuration.nix is machine-specific and not tracked in git. Copy the one the installer generated:
cp /etc/nixos/hardware-configuration.nix ~/nixos-config/hosts/nixos/hardware-configuration.nix
4. Review hosts/nixos/configuration.nix
Check these fields match your machine:
networking.hostName— change if you want a different hostnameusers.users.duynguyen— change username if needed (updatehome/hosts/nixos.nixto match)time.timeZone— currentlyAsia/Ho_Chi_Minh
5. Apply the configuration
sudo nixos-rebuild switch --flake ~/nixos-config#nixos
This builds and activates the full system + home-manager config in one step.
6. Log out and back in
Required so that:
- New locale settings (
LC_*) take effect - Niri session appears in SDDM
- Home-manager environment variables are loaded
At the SDDM login screen, select Niri from the session menu.
7. Vietnamese input (first time only)
After logging in:
- Open
fcitx5-configtool - Input Method tab → add Unikey
- Toggle EN/VI with
Super+Space
Daily usage
| Task | Command |
|---|---|
| Apply changes | sudo nixos-rebuild switch --flake ~/nixos-config#nixos |
| Update all flake inputs | nix flake update |
| Update one input | nix flake update noctalia |
| Roll back last switch | sudo nixos-rebuild switch --rollback |
| Search packages | nix search nixpkgs <name> |
| Check what changed | git diff |
How to modify things
Add a package
Open home/modules/applications/default.nix and add to home.packages.
Change niri settings
Edit home/modules/niri/config.kdl directly. Niri reloads the config automatically when the file changes after a rebuild.
Change noctalia bar / theme / idle
Edit home/modules/niri/noctalia/default.nix.
Add a wallpaper
Drop an image into home/modules/niri/noctalia/wallpapers/ and commit it.
Add a new machine
hosts/<name>/configuration.nix+hardware-configuration.nixhome/hosts/<name>.nix— import the modules you want- Add a new
nixosConfigurations.<name>entry inflake.nix